인프런 커뮤니티 질문&답변

AWWW님의 프로필 이미지
AWWW

작성한 질문수

카프카 완벽 가이드 - 커넥트(Connect) 편

JDBC Sink Connector에서 SMT를 이용하여 After 메시지로 변환 후 DB 입력하기

JDBC Sink Connector 에서 Topic Commit 처리 문의

작성

·

256

·

수정됨

0

안녕하세요 강사님

JDBC Sink Connector 에서 Topic 의 파티션이 다수인 경우 Topic 에 대한 Commit 처리를 어떻게 하는지 궁금합니다.

예를 들어 CDC Connector 로 저장된 Topic 을 MySQL 로 Sink 하고자 하는 경우이고 Topic 스키마에 당연히 키값은 있고 파티션이 10개 정도 된다고 했을때 Sink Connector 에서 최대 1000 개 데이터를 batch 로 DB에 처리하도록 설정했다면 Topic 에 대한 Commit 처리를 offset 정보를 loop 돌면서 commit 하는걸까요?

소스를 참고할수있다면 소스 레벨로 알려주시면 감사하겠습니다.

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

기본적으로 JDBC Connector는 batch_size 단위로 데이터를 Commit 합니다. 그러니까, Consumer가 한번에 읽어오는 batch 단위로 데이터를 DML Commit 적용합니다.

그런데, 만약 topic이 여러개이고, 이걸 병렬로 JDBC Connector로 처리하겠다고 하는 순간에 좀 얘기가 복잡해 집니다.

먼저 JDBC Connector의 tasks.max가 1(Default) 값이면 복잡할 게 없습니다. 그냥 하나의 Consumer가 떠서 읽어온 데이터를 1개의 JDBC Sink Worker Thread가 batch_size만큼 입력하는 로직입니다. 다만 토픽은 병렬로 되어 있지만, Consumer가 하나만 띄워지므로 읽어서 DB에 입력하는게 병렬로 입력하는 것 보다 느려 질 수 있습니다.

tasks.max 를 5로 설정하면 Consumer가 5개, 그리고 개별 Consumer별로 1개의 JDBC Sink Worker Thread(총 5개)가 개별적으로 batch_size 만큼 병렬로 입력하기 됩니다. 이 때 입력 대상 테이블이 1개라면 이상적으로는 5 * batch_size만큼 입력되겠지만, 실제로는 동시성 Lock이 걸려서 5배 보다는 적은 throughput으로 입력이 될 것 입니다.

만약 tasks.max가 5인데 입력 대상 테이블이 2개라면 좀 더 얘기가 복잡합니다. Consumer 5개와 JDBC Sink Worker Thread가 5개가 수행되어서 2개의 테이블에 알아서(?) 병렬로 입력하게 됩니다. 근데 정확히 어떤 기준으로 Thread가 나뉘는 지는 저도 정확한 말씀을 드리기는 어렵습니다. 이때 2개 테이블에 2와 3개로 Thread가 알아서(?) 쪼개지지 않을 까 싶습니다.

요약 드리자면 commit 단위는 batch_size 단위입니다. 만약에 tasks.max가 1보다 크면 개별 worker thread 별로 batch_size 단위로 commit 하게 됩니다.

감사합니다.

AWWW님의 프로필 이미지
AWWW
질문자

안녕하세요 강사님, 답변 감사합니다.

다만, 제 질문의 의도가 잘못 전달된 것 같아 다시 설명해드리면

제가 얘기한 Commit 은 DB 측의 Commit 이 아니라 Kafka Topic 에 대한 offset commit 을 얘기하는 것이였습니다.

배치 사이즈가 1000개라면 토픽의 데이터 1000개를 가져와서 DB 에 Insert 후 DB 단에서 commit 하는건 이해가 됩니다.

제가 얘기한 부분은 소스 토픽이 파티션이 1개가 아닌 10개일 경우 데이터를 가져오고나서 토픽에 대한 offset commit 을 어떻게 하는지에 대한 부분입니다.

정상적으로 db 에 데이터가 1000개 입력된 이후에 topic offeset 도 commit 이 되어야할 것 같은데 그때 topic offset commit 시 파티션 수만큼 loop 를 돌면서 마지막 offset commit 을 하는지에 대한 질문입니다.

 

권 철민님의 프로필 이미지
권 철민
지식공유자

Consumer가 읽은 Topic의 offset을 기록하는 방식은 Topic의 파티션에 좌우되기 보다는 Consumer에서 자체적으로 처리합니다.

Topic이 10개여도 Consumer가 1개이면 해당 Consumer가 읽고 처리한 만큼의 offset을 __offset_consumers 내부 Topic에 기록하게 됩니다.

Topic이 10개이고 Consumer가 2개라면 개별 Consumer들 각각이 읽고 처리한 만큼의 offset을 __offset_consumers 내부 토픽에 기록하게 됩니다.

때문에 offset 기록은 consumer가 알아서 수행하는 것이지, 파티션 수에 따라 loop를 돌면서 수행하는 메커니즘은 아닙니다.

 

AWWW님의 프로필 이미지
AWWW

작성한 질문수

질문하기