Kafka란
LinkedIn에서 개발한 분산 스트리밍 플랫폼
비동기 처리를 위한 메시징 큐

특징
빠름, 확장성, 안정성
발행/구독 모델
발행자(producer)가 메시지를 특정 수신자에게 직접 보내는 방식이 아니라 주제(topic)에 맞게 브로커에게 전달하면 구독자(consumer)가 브로커에게 요청해서 가져가는 방식
- 발행자는 메시지를 topic으로 카테고리화
- 구독자는 topic에 맞는 메시지를 브로커에게 요청
- 발행자와 구독자는 서로 알지 못함
Topic-Partition
Topic
- 메시지를 topic으로 분류
- topic은 발행자가 스트림을 발행하는 단위
- 스트림의 발행과 구독은 topic 단위로 처리
Partition
- 하나의 topic은 여러 개의 파티션으로 저장 가능
- 1 Topic -> N x Partition
- 1 Partition -> N x Log
파티션의 크기는 운영 중에 동적으로 줄일 수 없기 때문에 파티션의 개수 설정에 주의해야함
- 파티션에서 메시지의 상대적 위치를 오프셋(offset), 구독자는 현재까지 읽은 오프셋을 이용하여 데이터를 요청
- 파티션은 여러 개의 복제본으로 나누어 저장
replica 설정에 따라 복제하여 저장
데이터에 문제가 발생하면 복제된 데이터로 복구
- 파티션의 데이터 저장은 기본적으로 라운드 로빈 방식
Producer, Consumer
Producer
- 메시지를 생산하여 브로커에게 토픽으로 분류된 메시지를 전달
Consumer
- 원하는 토픽을 구독하여 스스로 조절하며 소비
- 원하는 토픽의 각 파티션에 존재하는 오프셋의 위치를 기억하고 관리하여 데이터 중복 관리
- 오프셋 관리를 통해 장애가 발생해도 마지막 읽었던 위치를 통해 다시 구독 가능
Consumer Group
- consumer 묶음으로 하나의 파티션에 하나의 구독자 그룹이 존재
- 파티션은 consumer 그룹의 구독자와 1:N 매칭
partition 4 : consumer 4 = 1:1 매칭, 가장 이상적
partition 4 : consumer 5 = consumer 1개 대기
partition 5 : consumer 4 = consumer 1개가 2개의 partition 소비
- 기본적으로 1:1로 설정
- consumer group 내부에서 하나의 consumer에 장애가 발생하더라도 다른 consumer가 장애가 발생한 consumer의 partition에 접근하여 데이터를 처리하여 장애 극복
브로커(Kafka Cluster)
- Kafka Server, 클러스터로 구성된 메시지 큐
- 메시지는 클러스터에 파티션 단위로 나누어 관리/복제
- 파일 시스템에 저장하므로 유실이 없고 복구 가능
- consumer가 메시지를 가져가도 바로 삭제하지 않음
Zookeeper
Zookeeper
- 브로커에 분산 처리된 메시지 큐의 정보들을 관리
파티션 수와 메시지 순서에 대한 이해


컨슈머는 각각의 파티션으로부터 데이터를 하나씩 가져올 때 첫번째 데이터를 가져올 뿐 파티션의 순서를 지키지 않음

partition 2에서 5가 2보다 먼저 나올 수 없음
partition 3에서 6이 3보다 먼저 나올 수 없음

Consumer Group 상세 설명
- peter-topic이라는 토픽을 consumer-01 그룹이 사용

server 1에 장애가 발생했을 때, 나머지 서버 3대로 작업을 이어갈 수 있음 -> 안정성 확보
만약 서버가 server 1만 존재했다면 대체할 수 있는 서버가 없기 때문에 작업이 중단됨
컨슈머 그룹은 자신의 그룹에 대한 offset을 관리함
만약 컨슈머 그룹이 없다면 Kafka에서 컨슈머를 구분할 수 없고, 컨슈머들은 자신만의 offset을 유지할 수 없음
Consumer Group이 없는 경우
peter-topic에 1 2 3 4라는 데이터가 들어가 있고, A 사용자가 1, 2, 3번까지 데이터를 가져갔습니다. 그리고는 다음에 가져갈 메시지는 4라는 자리 위치를 기록

컨슈머를 구분할 수 없기 때문에 B 사용자가 가져오기를 할 때, A 사용자가 데이터를 가져오면서 저장했던 offset 정보를 그대로 이용

Consumer Group이 있는 경우
컨슈머 그룹을 사용하게 되면 각 컨슈머 그룹별로 자신만의 offset을 갖고 관리하기 때문에 동일한 토픽을 여러 컨슈머 그룹이 소비하더라도 서로 다른 offset을 통해 데이터의 손실 없이 가져올 수 있음


참고
https://wikidocs.net/82721
https://www.popit.kr/kafka-%EC%9A%B4%EC%98%81%EC%9E%90%EA%B0%80-%EB%A7%90%ED%95%98%EB%8A%94-%EC%B2%98%EC%9D%8C-%EC%A0%91%ED%95%98%EB%8A%94-kafka/
https://www.popit.kr/kafka-consumer-group/