DataPipeline/Kafka

실전 카프카 - 6장 컨슈머 동작원리와 구현

wave35 2024. 12. 31. 05:44

[ 컨슈머 오프셋 관리 ]

- 컨슈머의 동작 중 핵심은 오프셋 관리 ( 컨슈머가 메세지를 어디까지 읽었는지 )

- 컨슈머들은 지정된 토픽의 메세지를 읽은 뒤, 오프셋 정보를 _consumer_offests 파일에 기록합니다.

- 컨슈머 그룹에서 컨슈머의 변경이 발생하면 _consumer_offests 통해 읽은 위치를 추적할 수 있습니다.

 

[ 그룹 코디네이터 ]

- 안정적인 컨슈머 그룹 관리를 위해 별도의 코디네이터가 존재합니다.

- 컨슈머 그룹이 구독한 토픽들을 트래킹하여, 작업을 균등하게 재분해하기 위해 리벨런싱 동작을 수행합니다.

( 새로운 컨슈머가 그룹 내에 추가되거나 삭제되는 멤버에 변화가 생기면 수행 )

- 컨슈머들의 변경을 가지하기 위해 그룹 코디네이터와 컨슈머들은 서로 하트비트를 주고 받습니다.

컨슈머 옵션 기본 값 설명
heartbeat.interval.ms 3000 - 그룹 코디네이터와 하트비트 interval 시간
- session.timeout.ms의 3/1 수준이 적절
session.timeout.ms 10000 - 컨슈머가 하트비트를 받지 못했다고 정하는 시간
- 문제가 발생했다고 판단하면 해당 컨슈머는 제거되고 리벨런싱 실행
max.poll.interval.ms 300000 - 컨슈머는 주기적으로 poll() 호출해 토픽에서 레코드 가져옴
- 문제가 발생했다고 판단하면 해당 컨슈머는 제거되고 리벨런싱 실행

 

- 코디네이터 프로세스

브로커에게 컨슈머와 초기 커넥션을 위한 요청을 보내고, 브로커는 이에 응답합니다.

컨슈머가 조인그룹 요청을 보내고 토픽 정보를 전달합니다.

코디네이터는 일반적으로 요청을 가장 먼저 보내는 컨슈머를 그룹 리더로 선택합니다.

코디네이터는 각 컨슈머에게 멤버 ID와 함께 모든 멤버의 목록과 구독 정보도 그룹 리더에게 반환하여,

컨슈머 그룹 리더가 파티션 할당 전략을 사용하여 파티션 할당을 수행하도록 합니다.

컨슈머 그룹 리더가 받은 토픽 정보를 토대로 컨슈머들에게 토픽의 파티션을 할당합니다.

그룹 리더는 멤버ID와 파티션에서 할당 정보를 전달하며, 다른 컨슈머들은 멤버ID만 전달합니다.

코디네이터는 그룹 리더가 제공한 정보를 사용하여 컨슈머에게 할당 정보를 반환합니다.

참조 : https://developer.confluent.io/courses/architecture/consumer-group-protocol/

 

[ 스태틱 멤버십 ] 

카프카 2.3 버전 부터 스태틱 멤버십이라는 개념을 도입해

컨슈머가 재시작 등으로 그룹에서 나갔다가 다시 합류하더라도 리벨런싱이 일어나지 않게 합니다.

리벨런싱이 일어날 때 컨슈머들은 중지되고, 리소스를 많이 잡아먹는 일입니다.

스태틱 멤버십을 적용하여 10대의 컨슈머가 순차적으로 재시작을 해야할 때 

리벨런싱이 10번 실행되지 않도록 합니다.

 

[ 컨슈머 파티션 할당 전략 ]

컨슈머 그룹의 리더가 정해진 파티션 할당 전략에 따라,

컨슈머와 토픽의 파티션을 매칭시킵니다.

파티션 할당 전략 옵션 값 - partiton.assignment.strategy 설명
레인지 전략 RangeAssignor 기본값으로, 토픽별로 할당 전략을 사용
라운드로빈 전략 RoundRobinAssignor 균등한 분배 가능
스티키 전략 StickyAssignor 컨슈머가 맵핑하고있는 파티션 유지 가능
협력적 스티키 전략 CooperativeStickyAssignor 스티지와 유사하지만, 연속적 재조정을 함

레인지 파티션 할당 전략

- 먼저 구독하는 토픽에 대한 파티션을 순서대로 나열한 후, 컨슈머를 순서대로 할당합니다.

- 파티션과 컨슈머 수가 일치(혹은 배수)가 아니면 컨슈머가 균등하지 않게 할당받을 수 있습니다.

 

라운드 로빈 파티션 할당 전략

- 파티션 순서대로 컨슈머를 번갈아가면서 파티션이 할당됩니다.

- 파티션과 컨슈머를 더욱 균등하게 맵핑합니다.

 

스티키 파티션 할당 전략

- 최초 배치전략은 라운드로빈과 흡사합니다.

- 앞서 두 전략은 컨슈머그룹의 리밸런싱으로 인해 파티션 재할당이 발생하면 균등하게 맵핑이 안됩니다.

- 스티키 전략은 재할당 작업이 발생하면 기존에 맵핑됬던 파티션과 컨슈머를 최대한 유지하려고 합니다.

협력적 스티키 파티션 할당 전략

- 스티키 전략과 비슷하지만 컨슈머 그룹 내부의 리밸런싱 동작이 한층 고도화됬습니다.

 

 

[ 정확히 한 번 커슈머 동작 ]

트랜잭션 코디네이터는 프로듀서의 정확히 한 번 전송이 성공하면 특수한 메세지를 레코드 추가합니다.

따라서 컨슈머는 트랜잭션 코디네이터가 표시한 레코드만 읽는다면, 정확히 한번 읽을 수 있습니다.

옵션명 설명
isolation.level read_uncommitted 커밋되지 않은 메세지 포함 ( 기본값 )
read_committed 커밋된 메세지만 읽음 ( 정확이 한 번 컨슈머 동작 )