ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [카프카 핵심 가이드] 추가 - 카프카 컨슈머 리밸런스
    DevBook 2025. 2. 11. 01:31

    ✅ two-phase rebalance protocol (리밸런스의 기본 동작 정의)

    • 컨슈머 그룹 내 한 개의 컨슈머가 그룹 리더로 선정된다. (가장 먼저 등록된 컨슈머)
    • 리밸런스는 두 단계로 구성된다.
      • 1단계 : JoinGroup
        • 그룹 코디네이터는 컨슈머가 그룹에 조인하기를 기다린다.
        • 컨슈머가 그룹 코디네이터에게 JoinGroup 요청을 보낸다.
          • 인코딩한 구독 정보 전달 (구독 토픽, 클라이언트가 정의한 유저 데이터)
        • 그룹 코디네이터는 그룹 리더에게 JoinGroup 응답으로 컨슈머들의 구독 정보를 보낸다.
      • 2단계 : SyncGroup
        • 그룹 리더는 구독 정보들을 디코딩하고, 각 컨슈머에게 파티션을 할당하여 해당 정보를 인코딩한다.
          • 해당 정보는 그룹 리더가 그룹 코디네이터에게 SyncGroup 요청을 보낼 때 함께 전송된다.
        • 컨슈머 그룹 내 모든 컨슈머들은 그룹 코디네이터에게 SyncGroup 요청을 보내야 한다.
        • 그룹 코디네이터는 각 컨슈머들에게 파티션 할당 정보를 포함한 SyncGroup 응답을 보낸다. (컨슈머들은 자신의 할당 정보만 알게 됨)

     

     eager rebalancing protocol

    • 위의 two-phase rebalance protocol을 구현하는 가장 심플한 방법
    • 특징
      • 컨슈머 그룹 내 모든 컨슈머가 그룹 코디네이터에게 JoinGroup 요청을 보내기 전 컨슈머에게 할당된 파티션에 대한 소유권을 취소한다.
      • 그룹 리더는 그룹 코디네이터로부터 JoinGroup 응답을 받고 파티션을 재할당한다.
    • 단점
      • 리밸런스가 수행되는 동안 컨슈머 그룹 내 모든 컨슈머는 레코드를 처리할 수 없다. => 해당 프로토콜이 "stop-the-world" 프로토콜로 불리는 이유
      • 파티션의 개수가 많아질수록 리밸런스에 소요되는 시간이 길어진다.

     

    ✅ incremental cooperative rebalancing protocol

    • 요약 : 재할당 대상 파티션에 대한 처리만 멈추고 나머지는 처리될 수 있게 하자!
    • 2번의 리밸런스가 수행된다.

     

    1st rebalance

    • 1단계 : 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/

    댓글

Designed by Tistory.