-
[카프카 핵심 가이드] 추가 - 카프카 컨슈머 리밸런스DevBook 2025. 2. 11. 01:31
✅ two-phase rebalance protocol (리밸런스의 기본 동작 정의)
- 컨슈머 그룹 내 한 개의 컨슈머가 그룹 리더로 선정된다. (가장 먼저 등록된 컨슈머)
- 리밸런스는 두 단계로 구성된다.
- 1단계 : JoinGroup
- 그룹 코디네이터는 컨슈머가 그룹에 조인하기를 기다린다.
- 컨슈머가 그룹 코디네이터에게 JoinGroup 요청을 보낸다.
- 인코딩한 구독 정보 전달 (구독 토픽, 클라이언트가 정의한 유저 데이터)
- 그룹 코디네이터는 그룹 리더에게 JoinGroup 응답으로 컨슈머들의 구독 정보를 보낸다.
- 2단계 : SyncGroup
- 그룹 리더는 구독 정보들을 디코딩하고, 각 컨슈머에게 파티션을 할당하여 해당 정보를 인코딩한다.
- 해당 정보는 그룹 리더가 그룹 코디네이터에게 SyncGroup 요청을 보낼 때 함께 전송된다.
- 컨슈머 그룹 내 모든 컨슈머들은 그룹 코디네이터에게 SyncGroup 요청을 보내야 한다.
- 그룹 코디네이터는 각 컨슈머들에게 파티션 할당 정보를 포함한 SyncGroup 응답을 보낸다. (컨슈머들은 자신의 할당 정보만 알게 됨)
- 그룹 리더는 구독 정보들을 디코딩하고, 각 컨슈머에게 파티션을 할당하여 해당 정보를 인코딩한다.
- 1단계 : JoinGroup
✅ eager rebalancing protocol
- 위의 two-phase rebalance protocol을 구현하는 가장 심플한 방법
- 특징
- 컨슈머 그룹 내 모든 컨슈머가 그룹 코디네이터에게 JoinGroup 요청을 보내기 전 컨슈머에게 할당된 파티션에 대한 소유권을 취소한다.
- 그룹 리더는 그룹 코디네이터로부터 JoinGroup 응답을 받고 파티션을 재할당한다.
- 단점
- 리밸런스가 수행되는 동안 컨슈머 그룹 내 모든 컨슈머는 레코드를 처리할 수 없다. => 해당 프로토콜이 "stop-the-world" 프로토콜로 불리는 이유
- 파티션의 개수가 많아질수록 리밸런스에 소요되는 시간이 길어진다.
✅ incremental cooperative rebalancing protocol
- 요약 : 재할당 대상 파티션에 대한 처리만 멈추고 나머지는 처리될 수 있게 하자!
- 2번의 리밸런스가 수행된다.
1st rebalance
- 1단계 : JoinGroup
- 컨슈머 그룹 내 모든 컨슈머가 그룹 코디네이터에게 JoinGroup 요청을 보낸다.
- 이때 자신이 할당받은 파티션에 대한 소유권을 취소하지 않고 해당 정보를 구독 정보에 담아 인코딩하여 함께 전송한다.
- 이전과 동일하게 그룹 코디네이터는 컨슈머들의 구독 정보를 합쳐 그룹 리더에게 JoinGroup 응답으로 보낸다.
- 컨슈머 그룹 내 모든 컨슈머가 그룹 코디네이터에게 JoinGroup 요청을 보낸다.
- 2단계 : SyncGroup
- 그룹 리더는 파티션을 컨슈머들에게 할당한다.
- 이때 소유권을 이전할 파티션은 할당하지 않는다. (하나의 파티션을 동일한 컨슈머 그룹 내 2개 이상의 컨슈머에게 할당할 수 없다는 규칙 준수)
- SyncGroup 응답으로 컨슈머들은 새로운 할당 정보를 받는다.
- 컨슈머들은 기존 파티션 할당 정보와 새로운 할당 정보를 비교하여 더이상 할당되지 않은 파티션에 대한 소유권을 취소한다.
- 그룹 리더는 파티션을 컨슈머들에게 할당한다.
- 참고) 할당받은 파티션에 대한 소유권을 취소하지 않았기 때문에 처리를 계속 수행함
- 위 그림에서 consumer A는 partition 1, 3 / consumer B는 partition 2에 대한 처리 계속 수행중
2nd rebalance
- 1단계 : JoinGroup
- 1st rebalance의 1단계와 동일
- 2단계 : SyncGroup
- 그룹 리더는 할당되지 않은 파티션을 특정 컨슈머에게 할당한다.
- SyncGroup 응답으로 새로운 파티션을 할당받은 컨슈머는 해당 파티션에 대한 처리를 수행한다.
- 참고) 재할당 대상 파티션을 제외한 나머지 파티션에 대한 처리를 계속 수행함
- 위 그림에서 consumer A는 partition 1 / consumer B는 partition 2에 대한 처리 계속 수행중
참고) https://www.confluent.io/blog/cooperative-rebalancing-in-kafka-streams-consumer-ksqldb/
'DevBook' 카테고리의 다른 글
[카프카 핵심 가이드] CH4. 카프카 컨슈머: 카프카에서 데이터 읽기 (1) (0) 2025.02.11 [카프카 핵심 가이드] 3.6 파티셔너 (카프카 3.9 버전 반영) (0) 2025.02.06 [카프카 핵심 가이드] CH3. 카프카 프로듀서: 카프카에 메시지 쓰기 (0) 2025.02.04 [카프카 핵심 가이드] CH1. 카프카 시작하기 (0) 2025.02.04