토픽에 저장된 데이터를 읽기 위해 협업하는 하나 이상의 컨슈머. 규칙은 하나다. 각 파티션은 그룹 안에서 오직 하나의 컨슈머만 읽는다. 이 대응 관계를 파티션 소유권(ownership)이라고 한다.

group.id와 파티션 배분

규칙 하나에서 세 가지가 따라 나온다. 컨슈머를 늘리면 파티션이 나눠 할당되어 처리량이 늘고, 컨슈머 하나가 죽으면 나머지가 그 파티션을 재할당받아 이어서 읽고, 메시지는 전체 컨슈머 그룹에서 한 번만 처리된다.

그룹을 가르는 것은 group.id다. 컨슈머 둘이 같은 그룹 ID로 같은 토픽을 구독하면 둘이 파티션을 나눠 갖는다. 그룹 전체로는 모든 메시지를 읽지만 각 컨슈머는 절반만 본다. 구독한 토픽의 모든 메시지를 혼자 다 읽어야 한다면 고유한 그룹 ID를 써야 한다.

리밸런스

파티션 소유권이 다시 배분되는 것이 리밸런스다. 컨슈머가 추가되거나 빠지면 일어나고, 그동안 처리가 멈춘다. 잦으면 신뢰성 있는 시스템이라고 하기 어려우므로 줄이는 방법을 둘 쓴다. 정적 그룹 멤버십은 재시작해도 같은 멤버로 인식시켜 불필요한 리밸런스 자체를 막고, 협력적 리밸런스는 전부 멈추는 대신 옮겨야 할 파티션만 옮겨 멈춤 시간을 줄인다. 리밸런스가 일어날 것을 전제로 코드를 짜는 방법은 컨슈머 신뢰성에서 본다.

파티션 수가 정하는 상한

컨슈머 수가 파티션 수를 넘으면 남는 컨슈머는 논다. 병렬 처리의 상한이 파티션 수라는 뜻이고, 파티션 수 결정이 중요한 이유다.

컨슈머 랙

얼마나 뒤떨어졌는지는 컨슈머 랙으로 본다. 파티션의 마지막 오프셋에서 커밋된 오프셋을 뺀 값이다. 이상적으로는 0이겠지만, 현실에서는 poll()이 여러 메시지를 리턴하고 컨슈머가 그것을 처리하는 동안 랙이 오르므로 계속 올랐다 내렸다 한다. 중요한 것은 값 자체가 아니라 추세다. 계속 따라붙고 있는지 계속 뒤처지고 있는지를 보고, 링크드인이 만든 버로우(Burrow)가 이 판단을 도와준다.

좀비 컨슈머

컨슈머가 멈추거나 연결이 끊기면 하트비트가 끊어지고 카프카는 죽었다고 판정해 파티션을 재할당한다. 그런데 그 컨슈머가 다시 깨어나면 자기가 죽은 줄 모르고 마지막 배치를 처리해서 결과를 쓴다. 스스로가 죽은 상태인지 모르는 이 컨슈머를 좀비라고 한다. 중복의 원인이고, 펜싱이 이것을 막으려고 존재한다.

관련

출처