규모 확장성
- 아래의 주요 컴포넌트들에 대한 규모 확장성을 고려해야 한다.
생산자
- 생산자는 그룹 단위의 조정과 무관하므로, 상대적으로 어렵지 않게 확장/축소가 가능하다.
소비자
- 소비자 그룹은 서로 독립적이므로 확장/축소가 쉽다.
- 소비자 그룹 내의 소비자가 추가/삭제되면 재조정(rebalancing)이 발생한다.
❗ 재조정(rebalancing)
- 소비자의 변경(실패/참여), heartbeat 실패, 파티션 변경 등이 발생하면 그룹 코디네이터가 재조정을 시작한다.
- 그룹 코디네이터는 그룹 리더를 선출하고, 선출된 리더가 파티션 할당 계획을 수립한다.
- 수립된 계획에 따라 각 소비자에게 새로운 파티션이 할당되고 소비가 재개된다.
브로커
- 브로커 노드는 실질적인 서버로, 장애 발생의 주요 지점이다.
- 브로커가 장애로 다운되면, 브로커 컨트롤러가 새로운 분산 계획을 수립한다.
- 새로 추가된 사본은 리더에 보관된 메시지를 따라잡는 동작을 개시한다.
- 주요 고려사항은 아래와 같다.
- 메시지가 commit되었음을 확인하는 기준으로, 얼마나 많은 사본이 동기화되어야 하는가?
- 사본 데이터는 여러 브로커 노드에 분산되어야 한다. 단일 노드에 사본을 저장하는것은 낭비이다.
- 사본을 여러 데이터센터에 분산하여 가용성을 높일 수 있다. 다만 응답 지연과 비용이 발생한다.
- 보다 원활한 장애 복구를 위해, 한시적으로 시스템에 설정된 사본 수보다 많은 수를 허용할 수 있다.
파티션
- 아래와 같은 이유로 인해 파티션을 조정해야 할 수 있다.
- 토픽의 규모 확장
- 가용성과 대역폭 사이의 균형 조정
- 기타 운영상의 이유
파티션 추가
- 파티션 추가 시, 기존에 존재하던 메시지(persistent messages)는 새로운 파티션으로 이동하지 않는다.
- 새로운 파티션에는 오직 새로운 메시지만 저장된다.
파티션 삭제
- 파티션의 퇴역(decommission)이 결정되면, 새로운 메시지는 오직 다른 파티션에만 저장된다.
- 퇴역된 파티션은 바로 제거되지 않고 일정 기간 보관된다.
- 해당 파티션을 읽고있는 소비자가 있을수 있기 때문이다.
- 이로인해 파티션 삭제 후에 저장 용량이 즉시 확보되지 않는다.
Q. 도서에서 파티션이 제거된다면 '생산자 그룹'이 재조정 작업을 수행해야 한다는데, 왜 그런가?
- 생산자 그룹은 오탈자로 보인다. 소비자 그룹이 재조정 작업을 수행해야 한다.
- 이는 파티션을 삭제하면, 소비자 그룹의 파티션 할당 정보가 변경되기 때문이다.
메시지 전달 방식
- 메시지 전달 방식은 아래와 같다.
- 최대 한 번(At Most Once)
- 최소 한 번(At Least Once)
- 정확히 한 번(Exactly Once)
최대 한 번(At Most Once)
- 생산자는 토픽에 메시지를 전송하고, 응답을 기다리지 않는다. (ACK=0)
- 전달이 실패하는 경우에도 재시도 하지 않는다.
- 소비자는 메시지를 전달받으면 처리 전에 오프셋부터 갱신한다.
- 오프셋 갱신 후 소비자가 실패하면 메시지는 소실된다.
- 메트릭 모니터링 등, 소량의 손실은 문제가 되지 않는 대규모 시스템에 적합하다.
최소 한 번(At Least Once)
- 같은 메시지가 소실되지는 않으나 중복 전달될 수 있다. (ACK=1 or ACK=all)
- 생산자는 메시지를 전송하고, 반드시 응답을 기다린다.
- 소비자는 메시지를 전달받으면 처리 후 오프셋을 갱신한다.
- 처리 후 오프셋 갱신 전에 실패하면, 메시지가 중복 전달될 수 있다.
- 중복 전달은 메시지 처리가 멱등성(idempotent)을 가지고 있다면 문제가 되지 않는다.
- 혹은 중복을 간단하게 제거 할 수 있거나, 중복이 발생해도 큰 문제가 없는 경우에 적합하다.
정확히 한 번(Exactly Once)
- 가장 신뢰도가 높은 방식이다.
- 하지만 그만큼 가장 구현이 까다로운 방식이다.
- 지불, 매매, 회계 등에서 사용된다.
- 멱등성을 보장하지 않은 어플리케이션에 적합하다.