컨슈머 리밸런스 프로토콜
컨슈머 리밸런스 프로토콜 (Consumer Rebalance Protocol)
이 페이지는 Apache Kafka 4.0부터 GA(일반 공개)된 차세대 컨슈머 리밸런스 프로토콜(KIP-848)을 설명해요. 리밸런스 속도와 컨슈머 그룹 확장성을 개선한 새 프로토콜을 서버·컨슈머 양쪽에서 어떻게 켜고 업그레이드하는지 다룹니다.
출처: 문서
본문
개요 (Overview)
Apache Kafka 4.0부터 차세대 컨슈머 리밸런스 프로토콜(KIP-848)이 GA(일반 공개, production-ready)가 되어 프로덕션 워크로드에 사용할 수 있습니다. 이 프로토콜은 컨슈머를 단순화하면서 컨슈머 그룹의 확장성을 개선합니다. 또한 완전히 증분 설계 덕분에 더 이상 전역 동기화 배리어에 의존하지 않아 리밸런스 시간도 줄어듭니다.
이제 두 가지 유형의 컨슈머 그룹이 있습니다. 컨슈머가 새 "consumer" 그룹 프로토콜을 사용하는지, 아니면 이전 "classic" 그룹 프로토콜을 사용하는지에 따라 이름이 붙습니다.
서버 (Server)
새 consumer 프로토콜은 Apache Kafka 4.0부터 서버에서 자동으로 활성화됩니다. 서버 측에서 프로토콜을 활성화·비활성화하는 것은 group.version 피처 플래그로 제어됩니다.
이제 컨슈머 하트비트 간격과 세션 타임아웃은 다음 구성으로 서버가 제어합니다.
group.consumer.heartbeat.interval.msgroup.consumer.session.timeout.ms
할당(assignment) 전략도 서버가 제어합니다. group.consumer.assignors 구성을 사용해 Consumer 그룹에 사용할 수 있는 어사이너(assignor) 목록을 지정할 수 있습니다.
- 기본적으로 uniform과 range 어사이너가 제공됩니다.
uniform이 기본값입니다(group.consumer.assignors목록의 첫 번째 어사이너). 단, Consumer가 다른 어사이너를 선택하지 않는 경우(클라이언트 구성group.remote.assignor통해서).- 서버 측에서 커스텀 할당 전략을 구현하는 것도 가능합니다.
ConsumerGroupPartitionAssignor인터페이스를 구현하고group.consumer.assignors구성에 전체 클래스 이름을 지정하면 됩니다.
클라이언트 측 어사이너에서 마이그레이션 (Migrating from Client-side Assignors)
다음 표는 클라이언트 측 어사이너에서 새 서버 측 어사이너로의 매핑을 보여줍니다.
| 클라이언트 측 어사이너 | 서버 측 어사이너 |
|---|---|
| RangeAssignor | range |
| CooperativeStickyAssignor | uniform |
| StickyAssignor | uniform |
| RoundRobinAssignor | uniform |
컨슈머 (Consumer)
Apache Kafka 4.0부터 Consumer는 새 Consumer 리밸런스 프로토콜을 완전히 지원합니다. 하지만 이 프로토콜은 기본적으로 활성화되지 않습니다. 이를 활성화하려면 group.protocol 구성을 consumer로 설정해야 합니다. 활성화되면 개선된 스레딩 모델과 함께 새 consumer 프로토콜이 사용됩니다.
subscribe(SubscriptionPattern)와 subscribe(SubscriptionPattern, ConsumerRebalanceListener) 메서드가 새 Consumer 리밸런스 프로토콜로 정규식을 구독하도록 추가되었습니다. 이 메서드들을 사용하면 정규식은 RE2J 형식을 사용하며 이제 서버 측에서 평가됩니다.
새 리밸런스 프로토콜을 사용할 때 Consumer에 새 지표가 추가되었으며, 주로 개선된 스레딩 모델에 대한 가시성을 제공합니다. 새 컨슈머 지표(New Consumer Metrics)를 참고하세요.
새 리밸런스 프로토콜이 활성화되면 다음 구성과 API는 더 이상 사용할 수 없습니다.
heartbeat.interval.mssession.timeout.mspartition.assignment.strategyenforceRebalance(String)및enforceRebalance()
업그레이드와 다운그레이드 (Upgrade & Downgrade)
오프라인 (Offline)
컨슈머 그룹은 비어 있을 때 Classic에서 Consumer로, 그 반대로 자동 변환됩니다. 따라서 모든 컨슈머를 종료하고 group.protocol=consumer 구성으로 다시 띄우면 그룹이 사용하는 프로토콜을 변경할 수 있습니다. 단점은 컨슈머 그룹을 내려야 한다는 것입니다.
온라인 (Online)
컨슈머 그룹은 group.protocol=consumer 구성으로 컨슈머를 롤링 배포하면 다운타임 없이 업그레이드할 수 있습니다. 새 Consumer 리밸런스 프로토콜을 사용하는 첫 컨슈머가 그룹에 합류하면 그룹은 Classic에서 Consumer로 변환되고, Classic 리밸런스 프로토콜은 새 Consumer 리밸런스 프로토콜과 함께 작동하도록 상호운용(interoperate)됩니다. 이것은 classic 그룹이 커스텀 메타데이터를 포함하지 않는 어사이너를 사용할 때만 가능합니다.
컨슈머 그룹은 반대 과정으로 다운그레이드할 수 있습니다. 이 경우 새 Consumer 리밸런스 프로토콜을 사용하는 마지막 컨슈머가 그룹을 떠날 때 그룹은 Consumer에서 Classic으로 변환됩니다.
진화 타임라인 (Evolution Timeline)
Consumer 리밸런스 프로토콜의 진화 타임라인은 KIP-1274에 설명되어 있으며 예상 일정은 다음과 같습니다.
- Apache Kafka 3.7: Early Access
- Apache Kafka 4.0: GA(production-ready).
- Apache Kafka 5.0: KafkaConsumer가 여전히 Classic을 지원하면서 Consumer 프로토콜을 기본값으로 사용.
- Apache Kafka 6.0: KafkaConsumer가 리밸런스 프로토콜로 Consumer만 지원하며, 브로커는 하위 호환성을 위해 Classic을 계속 지원.
제한 사항 (Limitations)
- 클라이언트 측 어사이너는 현재 지원되지 않으며 범위에 포함되지 않습니다. 커스텀 할당 전략이 다루지 못할 수 있는 경우 KAFKA-18327을 통해 피드백을 제공하세요.
- 랙 인식(rack-aware) 할당 전략은 아직 완전히 지원되지 않습니다(작업 진행 중, KAFKA-19387 참고).
더 알아보기 (Learn more)
group.protocol=consumer와group.remote.assignor클라이언트 구성이 새 프로토콜의 핵심이에요.- 온라인 롤링 업그레이드로 다운타임 없이 그룹을 변환할 수 있어요.
- 서버 측 어사이너는
group.consumer.assignors로 제어돼요.