Kafka 구조
- Topic은 하나의 테이블이라고 보는것이 좋다. 위 그림에서 Click, Upload Topic이 존재하며 Broker2 는 Broker1을 복제한것이다. 각각의 Topic은 partition으로 나뉜다.
- 다음과 같이 Partition이 여러개일 경우 producer가 보낸 메세지의 순서는 보장 못한다. 하지만 같은 partition에서의 순서는 보장된다. 그렇다면 순서가 보장될수 있도록 하는 방법은 무엇일까?
producer가 순서가 보장되고 싶은 메시지를 하나의 partition에 넣으면 된다. 메시지는 key에 따라 각자 다른 partition으로 할당 되도록 할 수있다. 또 다른 방법은 partition의 수를 1개로 고정하는 방법도 있다. 모두 상황과 사용량에 따라 적절한것을 사용하면 된다.
- 또 kafka는 다양한 서버(consumer)가 메세지를 가져갈 수 있다. 그렇다면 한 consumer가 먼저 메시지를 꺼내가면 다른 consumer는 그 메세지를 처리하지 못하는것일까?
아니다. 컨슈머가 메시지를 가져가도 큐에서 즉시 삭제 되지 않으며 , 하나의 토픽에 여러 Consumer 그룹이 붙어 메시지를 가져갈수 있다. 이것이 가능한 이유는 각 컨슈머가 각 topic에 대해 별고의 offset을 가지고 있으며 group에 consumer가 추가/제거 될 때마다 rebalancing을 하여 consumer들에게 partition을 할당하게 된다.
- 그렇다면 각각의 파티션에는 여러 consumer가 할당 될 수 있다는 건가?
하나의 consumer group에서는 각각의 파디션에 대해 하나의 consumer만 할당 된다. 예를들어 파티션 3개 하나의 consumer group에서 컨슈머가 2개라면 하나의 컨슈머는 두개의 파티션을 바라보게 된다. 반대로 파티션 2개 , 하나의 consumer group에서 컨슈머가 3개라면 한 컨슈머는 파티션을 할당 받지 못하고 놀게 된다.
- Offset은?
offset은 컨슈머가 메시지를 어디까지 읽었는지 저장하는 값이다. 예를들어 offset이 5라면 0~4는 읽은 것이다. offset은 broker에 기록이 되며 기록이 유지되는 시간은 offsets.retention.minutes 에 명시된 시간동안 저장이 되며 이기간이 지나면 리셋이 된다. 그래서 이럴때를 대비하여 auto.offset.reset 을 지정하여 리셋될때 바라보는 값을 설정할 수 있다.
참고
Apache Kafka 기본 개념 (Partition / Consumer / Consumer Group/ Offset Management)