[카프카 핵심 가이드] 카프카 컨슈머: 개념 - 컨슈머 그룹과 파티션 리밸런스
1) 서문
- 앞에서 보았듯이, 컨슈머 그룹에 속한 컨슈머들은 자신들이 구독하는 토픽의 파티션들에 대한 소유권을 공유한다.
새로운 컨슈머를 컨슈머 그룹에 추가하면 이전에 다른 컨슈머가 읽고 있던 파티션으로부터 메시지를 읽기 시작한다.
컨슈머가 종료되거나 크래시가 났을 경우도 마찬가지다. 해당 컨슈머가 컨슈머 그룹에서 나가면 원래 이 컨슈머가 읽던
파티션들은 그룹에 잔류한 나머지 컨슈머 중 하나가 대신 받아서 읽기 시작하는 것이다.
- 컨슈머에 파티션을 재할당하는 작업은 컨슈머 그룹이 읽고 있는 토픽이 변경되었을 때도 발생한다.
컨슈머에 할당된 파티션을 다른 컨슈머에게 할당해주는 작업을 '리밸런스(rebalance)'라고 한다.
리밸런스는 컨슈머 그룹에 (쉽고 안전하게 컨슈머를 제거할 수 있도록 해 줌과 동시에)
높은 가용성(high availability)과 규모 가변성(scalability)을 제공하는 기능이기 때문에 매우 중요하지만,
문제없이 작업이 수행되고 있는 와중이라면 그리 달갑지 않은 기능이기도 하다.
- 리밸런스에는 컨슈머 그룹이 사용하는 파티션 할당 전략에 따라 2가지가 있다.
여기 포함된 그림들은 Sophie Blee-Goldman이 2020년 5월, 컨플루언트 블로그에 올린
'From Eager to Smarter in Apache Kafka Consumer Rebalances'라는 글에서 가져온 것이다.
2) 조급한 리밸런스
- 조급한 리밸런스가 실행되는 와중에 모든 컨슈머는 읽기 작업을 멈추고 자신에게 할당된 모든 파티션에 대한
소유권을 포기한 뒤, 컨슈머 그룹에 다시 참여(rejoin)하여 완전히 새로운 파티션 할당을 전달받는다.
이러한 방식은 근본적으로 전체 컨슈머 그룹에 대해 짧은 시간 동안 작업을 멈추게 한다.
- 작업이 중단되는 시간의 길이는 컨슈머 그룹의 크기는 물론 여러 설정 매개 변수에 영향을 받는다.
그림 4-6은 조급한 리밸런스가 어떻게 두 단계에 걸쳐 일어나는지를 보여준다.
즉, 우선 모든 컨슈머가 자신에게 할당된 파티션을 포기하고, 파티션을 포기한 컨슈머 모두가 다시 그룹에
참여한 뒤에야 새로운 파티션을 할당받고 읽기 작업을 재개할 수 있다.
3) 협력적 리밸런스
- 협력적 리밸런스의 경우 한 컨슈머에게 할당되어 있던 파티션을 다른 컨슈머에 재할당한다.
재할당되지 않은 파티션에서 레코드를 읽어서 처리하던 컨슈머들은 작업에 방해받지 않고
하던 일을 계속할 수 있는 것이다.
이 경우 리밸런싱은 2개 이상의 단계에 걸쳐서 수행된다. 즉, 우선 컨슈머 그룹 리더가 다른 컨슈머들에게
각자에게 할당된 파티션 중 일부가 재할당될 것이라고 통보하면,
컨슈머들은 해당 파티션에서 데이터를 읽어 오는 작업을 멈추고 해당 파티션에 대한 소유권을 포기한다.
- 두 번째 단계에서는 컨슈머 그룹 리더가 이 포기된 파티션들을 새로 할당한다.
이 점진적인 방식은 안정적으로 파티션이 할당될 때까지 몇 번 반복될 수 있지만,
조급한 리밸런스 방식에서 발생하는 전체 작업이 중단되는 상태('stop the world')는 발생하지 않는다.
- 이 특징은 리밸런싱 작업에 상당한 시간이 걸릴 위험이 있는, 컨슈머 그룹에 속한 컨슈머 수가 많은 경우에
특히 중요하다. 그림 4-7은 협력적 리밸런스가 어떻게 컨슈머와 파티션의 일부만을 재할당함으로써
점진적으로 리밸런싱을 수행하는지를 보여준다.
- 커슈머는 해당 컨슈머 그룹의 그룹 코디네이터 역할을 지정받은 카프카 브로커(컨슈머 그룹별로 다를 수 있다)에
하트비트를 전송함으로써 멤버십과 할당된 파티션에 대한 소유권을 유지한다.
하트비트는 컨슈머의 백그라운드 스레드에 의해 전송되는데, 일정한 간격을 두고 전송되는 한 연결이 유지되고 있는 것으로
간주된다.
- 만약 컨슈머가 일정 시간 이상 하트비트를 전송하지 않는다면,
세션 타임아웃이 발생하면서 그룹 코디네이터는 해당 컨슈머가 죽었다고 간주하고 리밸런스를 실행한다.
만약 컨슈머가 크래시 나서 메시지 처리를 중단했을 경우, 그룹 코디네이터는 몇 초 이상 하트비트가 들어오지 않는 것을 보고
컨슈머가 죽었다고 판단한 뒤 리밸런스를 실행시킨다.
이 몇 초 동안 죽은 컨슈머에 할당되어 있던 파티션에서는 아무 메시지도 처리되지 않는다.
- 컨슈머를 깔끔하게 닫아줄 경우 컨슈머는 그룹 코디네이터에게 그룹을 나간다고 통지하는데,
그러면 그룹 코디네이터는 즉시 리밸런스를 실행함으로써 처리가 정지되는 시간을 줄인다.
이 장의 후반부에서 우리는 하트비트 주기와 세션 타임아웃 설정 옵션과 함께 그리고 컨슈머 작동을 정밀하게 제어하는데
사용할 수 있는 다른 설정 매개변수들에 대해서 알아볼 것이다.