그룹 코디네이터
컨슈머 그룹에서 각 컨슈머들에게 작업을 균등하게 분해하는 동작을 '컨슈머 리밸런싱'이라고 부르거나 '컨슈머 리밸런싱이 일어났다'라고 표현
안정적인 컨슈머 그릅 관리를 위해 별도의 코디네이터가 존재 ( 그룹 코디네이터라고 부름)
- 그룹 코디네이터의 목적 : 컨슈머 그룹이 구독한 토픽의 파티션들과 그룹의 멤버들을 트래킹하는 것
→ 따라서 파티션 또는 그룹의 멤버에 변화가 생기면 작업을 균등하게 재분배하기 위해 컨슈머 리밸런싱 동작이 발생함
그룹 코디네이터는 각 컨슈머 그룹별로 존재하며, 이러한 그룹 코디네이터는 카프카 클러스터 내의 브로커 중 하나에 위치함
그룹 코디네이터와 컨슈머 그룹 관계
컨슈머 그룹이 브로커에 최초 연결 요청을 보내면 브로커 중 하나에 그룹 코디네이터가 생성되고, 이 그룹 코디네이터는 컨슈머 그룹의 컨슈머 변경과 구독하는 토픽파티션 변경 등에 대한 감지를 시작함
토픽 파티션과 그룹의 멤버 변경이 일어나면 변경된 내용을 컨슈머들에게 알려주기도 함
컨슈머 그룹 등록 과정
① 컨슈머는 컨슈머 설정값 중에서 bootstrap.brokers 리스트에 있는 브로커에게 컨슈머 클라이언트와 초기 커넥션을 연결하기 위한 요청을 보낸다
② 해당 요청을 받은 브로커는 그룹 코디네이터를 생성하고 컨슈머에게 응답을 보낸다. 컨슈머 그룹의 첫 번째 컨슈머가 등록될 때까지 아무 작업도 일어나지 않음
③ 그룹 코디네이터는 group.inintial.rebalance.delay.ms의 시간 동안 컨슈머의 요청을 기다림
④ 컨슈머는 컨슈머 등록 요청을 그룹 코디네이터에게 보낸다. 이 때 가장 먼저 요청을 보내는 컨슈머가 컨슈머 그룹의 리더가 됨
⑤ 컨슈머 등록 요청을 받은 그룹 코디네이터는 해당 컨슈머 그룹이 구독하는데 토픽 파티션 리스트 등 리더 컨슈머의 요청에 응답을 보냄
⑥ 리더 컨슈머는 정해진 컨슈머 파티션 할당 전략에 따라 그룹 내 컨슈머들에게 파티션을 할당한 뒤 그룹 코디네이터에게 전달하
⑦ 그룹 코디네이터는 해당 정보를 캐시하고 각 그룹 내 컨슈머들에게 성공을 알림
⑧ 각 컨슈머들은 각자 지정된 토픽 파티션으로부터 메시지들을 가져옴
실제로 컨슈머그룹과 그룹 코디네이터가 서로 긴밀하게 내용을 주고 받으며 컨슈머 그룹이 안정적으로 메시지를 읽어갈 수 있도록 유지함
컨슈머들의 변경을 감지하기 위해 그룹 코디네이터와 컨슈머들은 서로 하트비트를 주고 받음. 이렇게 하트비트를 주기적으로 주고받으면서 컨슈머가 살아있는지 , 잘 동작하는지 확인함
하트비트와 관련된 옵션
heartbeat.interval.ms | 3000 | 기본값은 3000이며, 그룹 코디네이터와 하트비트 인터벌 시간임. 해당 시간은 session.timeout.ms보다 낮게 설정해야 하며, 3분의 1 수준이 적절함 |
session.timeout.ms | 10000 | 기본값은 10000임. 어떤 컨슈머가 특정 시간 안에 하트비트를 받지 못하면 문제가 발생했다고 판단해 컨슈머 그룹에서 해당 컨슈머는 제거되고 리밸런싱 동작이 일어남 |
max.poll.interval.ms | 300000 | 기본값은 300000dla. 컨슈머는 주기적으로 poll()을 호출하여 토픽으로부터 레코드들을 가져오는데, poll()호출 후 최대 5분간 poll()호출이 없다면 컨슈머가 문제가 있는 것으로 판단해 리밸런싱 동작이 일어남 |
컨슈머 리밸런싱 동작은 경우에 따라 매우 높은 비용이 지출되므로 가급적 리밸런싱이 자주 발생하지 않도록 주의.
옵션값들을 조금씩 변경해 컨슈머 다운을 더 빠르게 혹은 더 느리게 감지하도록 조정할 수 있음
하지만 옵션값들의 시간을 일부 변경해 그룹 코디네이터가 컨슈머의 다운을 빠르게 감지하도록 설정해둔다면, 일시적인 컨슈머의 타임아웃이나 일시적인 TCP 패킷 손실로 인해 원하지 않은 리밸런싱이 빈번하게 일어나는 현상이 발생할 수 있음.
반대로 그룹 코디네이터가 컨슈머 다운을 늦게 감지하도록 설정해두면 그 시간만큼 해당 파티션의 메시지를 읽지 못하는 현상이 발생할 수 있음
가능하면 기본 설정을 유지하기를 권장