발신자의 메시지는 수신자가 정해져 있지 않으며 정해진 범주에 따라 구독을 신청한 수신자에게 브로드캐스팅 되는 방식으로 수신자는 발행자에 대한 정보가 없어도 메시지를 수신받을 수 있음
발행-구독 모델의 범주의 역할
카프카의 토픽은 파티션이란 단위로 쪼개져 각 클러스터에 분산되어 저장되며 복제 및 장애 발생 시에도 파티션 단위로 처리된다.
파티션이 메시지에 부여하는 값으로 메시지를 식별하는 ID로 사용 (초기 값: 0)
토픽에서 메시지를 식별할 때는 파티션 번호와 오프셋 번호를 함께 사용하여 식별
발행-구독 모델의 발신자 역할
메시지를 생성하여 브로커에게 전달한다. 메시지를 배치 형태로 한번에 전달할 수 있음
전달받은 메시지를 토픽별로 분류하여 메시지를 쌓는 역할 역할
카프카는 브로커들이 클러스터로 구성되어 동작하도록 설계되어 있으며 주키퍼는 클러스터 내의 브로커에 대한 분산처리를 담당
발행-구독 모델의 수신자 역할
토픽을 구독하며 메시지가 존재하면 가져가서 처리
특정 파티션에 대한 접근을 허용하는 방식 동일한 그룹의 컨슈머는 동일한 파티션에 접근할 수 없음
컨슈머 그룹 내의 컨슈머의 수가 파티션의 수 보다 적으면 하나의 컨슈머가 여러개의 파티션을 소유하게 되고 컨슈머의 수가 파티션의 수 보다 많으면 여분의 컨슈머는 메시지를 처리하지 않는 유휴 상태가 됨
컨슈머 그룹에 속해있는 컨슈머 중 특정 파티션에 대한 접근권한을 가진 컨슈머
브로커나 컨슈머의 구성이 변동되지 않는 한 계속 유지 됨
- 컨슈머가 추가되거나 제거되면 컨슈머 그룹내의 컨슈머들이 파티션 재분배
- 브로커가 추가되거나 제거되면 전체 컨슈머 그룹에서 파티션 재분배
- 브로커가 한개 일때도 클러스터로 동작
- 다수의 메시지를 배치형태로 브로커에게 한 번에 전달 가능
- 메시지를 파일 시스템에 저장
- 영속성 보장
- 메시지가 쌓여도 성능저하 없음
- 처리된 메시지를 삭제하지 않기 때문에 문제가 발생하거나 처리로직이 변경되면 재작업(rewind) 가능
- 컨슈머가 브로커에서 메시지를 가져오는 pull 방식
- 컨슈머가 처리능력 만큼의 메시지만 브로커에서 가져올 수 있음
- 브로커는 컨슈머가 어떤 메시지를 처리하는지 계산하고 추척하지 않아도 됨
- 메시지를 쌓아두었다가 주기적으로 처리(batch) 가능