DevSprout / Practice-Kafka-Dev-To-Production

✉️ 실전 카프카 개발부터 운영까지 스터디
3 stars 0 forks source link

Chapter 06. 컨슈머의 내부 동작 원리와 구현 #6

Open MinJunKweon opened 2 years ago

minkukjo commented 2 years ago

끄적끄적

image

MinJunKweon commented 2 years ago

궁금한 내용


컨슈머 오프셋

그룹 코디네이터

그룹 코디네이터 동작 순서

그룹 코디네이터 동작 순서

  1. 컨슈머는 컨슈머 설정값 중에서 bootstrap.brokers 리스트에 있는 브로커에게 컨슈머 클라이언트와 초기 커넥션을 연결하기 위한 요청을 보냄
  2. 해당 요청을 받은 브로커는 그룹 코디네이터를 생성하고, 컨슈머에게 응답을 보냄. 첫번째 컨슈머가 등록될 때까지 대기
  3. 그룹 코디네이터는 group.initial.rebalance.delay.ms의 시간 동안 컨슈머의 요청을 대기
  4. 컨슈머 등록 요청을 그룹 코디네이터에 전송. 가장 먼저 요청을 보내는 컨슈머가 리더 컨슈머
  5. 컨슈머 등록 요청을 받은 그룹 코디네이터는 해당 컨슈머 그룹이 구독하는 토픽 파티션 리스트 등을 리더 컨슈머에 응답
  6. 리더 컨슈머는 정해진 컨슈머 파티션 할당 전략에 다라 그룹 내 컨슈머들에게 파티션을 할당한 뒤 그룹 코디네이터에게 전달
  7. 그룹 코디네이터는 해당 정보를 캐시하고 각 그룹 내 컨슈머들에게 성공을 알림
  8. 각 컨슈머들은 각자 지정된 토픽 파티션으로부터 메시지 컨슈밍
    • 이후 컨슈머가 합류하거나 떠날 때, 컨슈머는 코디네이터에 Join 혹은 Leave 요청을 보내서 처리함

만약 컨슈머가 Leave 요청을 보내지 않고 종료된다면 코디네이터는 어떻게 감지할 수 있는가?

컨슈머 옵션 설명 기본값
heartbeat.interval.ms 그룹 코디네이터와 하트비트 인터벌 시간
해당 시간은 session.timeout.ms보다 낮게 설정해야 함. 일반적으로 1/3 수준
3000 (3초)
session.timeout.ms 컨슈머와 브로커사이의 session timeout 시간
이 시간이 지나면 해당 컨슈머는 종료되거나 장애가 발생한 것으로 간주되어 리밸런싱이 일어남
10000 (10초)
max.poll.interval.ms 컨슈머 poll() 호출 인터벌 시간
컨슈머가 poll()을 호출 후 최대 설정시간만큼 지나도 다시 poll()을 호출하지 않으면 문제가 있는 것으로 판단
300000 (5분)

스태틱 멤버십

컨슈머 파티션 할당 전략

파티션 할당 전략 설명
Range 파티션 할당 전략 토픽별로 할당 전략을 사용함. 동일한 키를 이용하는 2개 이상의 토픽을 컨슘할 때 유용함 (기본값)
Round-Robin 파티션 할당 전략 사용 가능한 파티션과 컨슈머들을 라운드 로빈으로 할당함.
Sticky 파티션 할당 전략 컨슈머가 컨슘하고 있는 파티션을 계속 유지할 수 있음
Cooperative Sticky 파티션 할당 전략 스티키 방식과 유사하지만, 전체 일시 정지가 아닌 연속적인 재조정 방식 (3.0 버전 이상 기본값)

레인지 파티션 할당 전략 (기본값)

라운드 로빈 파티션 할당 전략

스티키 파티션 할당 전략

협력적 스티키(Cooperative Sticky) 파티션 할당 전략

협력적 프로토콜 방식

  1. 컨슈머가 새로 합류하면 리밸런싱이 트리거됨
  2. 컨슈머 그룹 내의 컨슈머들은 합류 요청과 자신들이 컨슘하는 토픽의 파티션 정보를 코디네이터에 전송함
  3. 코디네이터가 정보를 조합해 리더 컨슈머에 전송함
  4. 리더 컨슈머가 제외해야할 파티션 정보를 담아서 그룹 멤버들에게 전달함
  5. 그룹 멤버들은 필요없는 파티션을 골라 제외함. 만약 제외할 게 없으면 아무 작업을 하지 않음
  6. 제외된 파티션 할당을 하려고 컨슈머들이 다시 합류 요청을 보냄
  7. 리더 컨슈머는 제외된 파티션을 적절히 컨슈머들에 할당함

정확히 한 번(Exactly-once) 컨슈머 동작

LOG-INFO commented 2 years ago

끄적끄적

좋은 글 추천

LOG-INFO commented 2 years ago

Understanding Kafka partition assignment strategies and how to write your own custom assignor 위 문서를 보면 partition.assignment.strategy가 list인 이유를 알 수 있네여. 컨슈머 그룹 내의 모든 컨슈머들이 같은 프로토콜을 지원한다는 보장이 없어서 여러 개 지정하는 듯 HTTP의 Accept 헤더 같은 느낌

LOG-INFO commented 2 years ago

worker thread 병렬처리(여러 파티션 consuming 병렬처리 말고) 중 늦은 메시지가 먼저 처리되면?