컨슈머의 동작 중 가장 핵심은 오프셋 관리입니다. 컨슈머는 카프카에 저장된 메시지를 꺼내오는 역할을 하기 때문에 컨슈머가 메시지를 어디까지 가져왔는지를 표시하는것은 매우 중요합니다. 컨슈머가 어떠한 문제로 동작을 멈추고 재시작하는 경우나 컨슈머가 구동중인 서버에 문제가 발생해서 다른 컨슈머가 역할을 대신하는등 새로운 컨슈머가 메시지를 가져올 수 있어야만 장애로 부터 빠르게 복구 될 수 있습니다.
컨슈머들은 하나의 컨슈머 그룹의 구성원이 되고 컨슈머 그룹 내의 각 컨슈머들은 서로 자신의 정보를 공유하면서 하나의 공동체로 동작합니다. 이때 컨슈머개인? 의 변화가생겨 나가거나 들어왔을때 컨슈머 그룹에서 각 컨슈머들에게 작업을 균등하게 분해하는 동작을 컨슈머리벨런싱 이라고 합니다.
그리고 컨슈머 그룹역시 그룹 코디네이터라는 안정적인 컨슈머 그룹관리를 위해 별도의 코디네이터가 존재합니다.
그룹코디네이터의 목적은 컨슈머 그룹이 구독한 토픽의 파티션들과 그룹의 맴버들을 트래킹 하는것입니다. 그로인해 파티션 또는 그룹의 멤버에 변화가 생기면 작업을 균등하게 재분배 하기 위해 컨슈머 리벨런싱 동작이 발생합니다.
그룹 코디네이터는 각 컨슈머 그룹별로 존재합니다.
대용량 메시지들을 처리하는 컨슈머 그룹이라면 리벨런싱 동작으로 인해 원래 상태를 복구하는데 상당한 시간이 소요 될 수 있습니다. 이런 불필요한 리벨런싱을 방어하기 위해 카프카 2.3버전 부터 스태틱 멤버십이라는 개념이 도입됐습니다.
컨슈머 그룹내에서 컨슈머가 재시작 등으로 그룹에서 나갔다가 다시 합류하더라도 리벨런싱이 일어나지 않게 합니다. 즉 컨슈머마다 인식할 수 있는 ID를 적용함으로써 다시 합류하더라도 그룹 코디네이터가 기존 구성원임을 인식할 수 있게 하는 것입니다.
스태틱 멤버십 기능이 적용된 컨슈머는 그룹에서 떠날 때 그룹 코디네이터에게 알리지 않으므로 불필요한 리밸런싱도 발생하지 않습니다.
프로듀서의 파티셔너라는 기능은 레코드를토픽의 어느 파티션으로 전송ㅇ할지를결정하는 역할을 했습니다. 컨슈머의 동작에서도 이와 유사하게 대상 토픽의 어느 파티션으로 부터 레코드를 읽어 올지를 결정합니다.
컨슈머 그룹의 리더 컨슈머가 정해진 파티션 할당 전략에 따라 각 컨슈머와 대상 토픽의 파티션을 매칭시킵니다.
파티션 할당 전략은 컨슈머 옴션의 partition, assignment.strategy로 표시하며, RangeAssigno(레인지 전략), RoundRobinAsstgnor(라운드 로빈 전략), StixkyAsstgnor(스티키 전략),CooperativeStixkyAssignor(협력적 스티키 전략)라 는 총 네 가지를 제공합니다.
레인지 파티션 할당 전략인 RangeAssignor는 파티션 할당 전략중 기본값으로서, 각 토픽별로 할당 전략을 사용하게 됩니다. 먼저 구독하는 토픽에 대한 파티션을 순서대로 나열한 후 컨슈머를 순서대로 정렬합니다. 그 후 각 컨슈머가 몇개의 파티션을 할당해야 하는지 전체 파티션 수를 컨슈머 수로 나눕니다.
불균형한 레인지 파티션 할당 전략을 사용하는 이유는 동일한 레코드 키를 사용하고 하나의 컨슈머 그룹이 동일한 파티션 수를 가진 2개 이상의 토픽을 컨슘할때 유용할 수 있습니다. 이와같은 특수한 경우에 좋지만 컨슈머에 균등하게 파티션이 분배돼야 하는 작업에서는 비효율 적입니다.
컨슘해야 하는 모든 파티션과 컨슈머 그룹 내 모든 컨슈머를 나열한 후 라운드 로빈으로 하나씩 파티션과 컨슈머를 할당하는 전략입니다.
컨슈머 그룹의 리밸런싱 동작으로 인해 파티션이 재할당 된다면 기존에 매핑됐던 파티션과 동일한 컨슈마가 다시 매핑되리라고는 보장할 수 없습니다. 이러한 재 할당 작업이 발생하더라도 기존에 매핑됐던 파티션과 컨슈머를 최대한 유지하려고 하는 전략이 스티키 파티션 할당전략입니다.
해당전략을 사용하는목적은 두가지 목적으로 첫번째는 가능한 균형잡힌 파티션 할당이고, 두번째 목적은 재할당이 발생할때 되도록 기존의 할당된 파티션 정보를 보장하는 것입니다. 둘중에 첫번째 목적의 우선순의가 더 높습니다.
재할당 동작 원리
스티키 파티션 할당전략과 결과적으론 동일한 방식입니다. 한가지 차이점이 있다면 컨슈머 그룹 내부의 리벨런싱 동작이 한층 더 고도화 됐다는 점입니다.
해당전략은 안전하게 파티션의 소유권을 이동하기 위해 리밸런싱 작업이 수차례 걸쳐 진행하는 것도 나쁘지 않다는 아이디어에서 출발했습니다.
1. 리벨런싱시작
2. 그룹내 컨슈머들이 그룹 합류 요청과 자신들이 컨슘하는 토픽의 파티션 정보를 그룹 코디네이터로 전송
3. 그룹 코디네이터는 해당 정보를 조합해 컨슈머 그룹의 리더에게 전송
4. 컨슈머 그룹의 리더는 현재 컨슈머들이소유한 파티션 정보를 활용해 제외해야 할 파티션 정보를 담은 새로운 파티션 할당 정보를 컨슈머 그룹 멤버들에게 전달
5. 새로운 파티션 할당정보를 받은 컨슈머 그룹 멤버들은 현제의 파티션 할당 전략과 차이를 비교해 보고 필요없는 파티션을 골라 제외합니다. 이전파티션 할당정보와 새로운 파티션 할당정보가 동일한 파티션 들에 대해서는 작업을 수행할 필요없습니다.
6. 제외된 파티션 할당을 위해 컨슈머들은 다시 합류 요청을 합니다. 여기서 두번제 리벨런싱 시작
7. 컨슈머 그룹의 리더는 제외된 파티션을 적절한 컨슈머에게 할당합니다.