[Kafka]파티션과 메세지 순서, 컨슈머 그룹


이 글은 카프카, 데이터 플랫폼의 최강자 고승범/공용준 님의 책을 공부하며
정리하는 글입니다.

파티션과 메세지 순서, 컨슈머 그룹

파티션과 메세지 순서에 대해서 알아보기

토픽 생성하기

  • 카프카 실행, 주키퍼 실행
잘되는 코드
$ /home/shalee729/kafka/bin/kafka-topics.sh \  
zookeeper-01:2181,zookeeper-02:2181,zookeeper-03:2181/shalee729-kafka \  
--replication-factor 1 --partitions 3 --topic peter-01 --create  
출력: Created topic "peter-01".
잘 안되는 코드
$ /home/shalee729/kafka/bin/kafka-topics.sh \
--zookeeper zookeeper-01:2181,zookeeper-02:2181,zookeeper-03:2181/shalee929-kafka \
--topic peter-01 --partitions 3 --replication-factor 1 --create
  • 참 희안한 부분이 책에서(p188) 마지막 옵션을 줄 때,
  • –topic peter-01 –partitions 3 –replication-factor 1 –create 시
  • Replication factor: 1 larger than available brokers: 0 이런 오류가 난다.
  • 아직 왜 문제점인지 찾지 못하였고, 내부적인 오류이거나 zookeeper가 kafka node를 안보고 있다는 것인데 분명 /etc/hosts나 kafka 설정은 문제가 없었다.

토픽으로 메시지 전송하기(프로듀서), 가져오기(컨슈머)

메시지 전송하기
$ /home/shalee729/kafka/bin/kafka-console-producer.sh \  
--broker-list zookeeper-01:9092,zookeeper-02:9092,zookeeper-03:9092 \  
--topic peter-01  
>a
>b
>c
>d
>e
Ctrl + C로 나오기
가져온 결과보기
$ /home/shalee729/kafka/bin/kafka-console-consumer.sh \  
--bootstrap-server zookeeper-01:9092,zookeeper-02:9092,zookeeper-03:9092 \  
--topic peter-01 --from-beginning  
Ctrl + C로 나오기
다시 메시지 전송하기  
$ /home/shalee729/kafka/bin/kafka-console-producer.sh \  
--broker-list zookeeper-01:9092,zookeeper-02:9092,zookeeper-03:9092 \  
--topic peter-01  
>1
>2
>3
>4
>5
갸져온 결과보기
$ /home/shalee729/kafka/bin/kafka-consoconsumducer.sh \  
--bootstrap-server zookeeper-01:9092,zookeeper-02:9092,zookeeper-03:9092 \  
--topic peter-01 --from-beginning  
c
3
b
e
2
5
a
d
1
4
  • 입략한 순서와는 전혀 다르게 출력되었습니다.
  • 입력 실수가 아닌 이러한 메시지 순서로 출력되는 이유가 있습니다.

파티션 별로 메시지를 가져와서 보자

$ /home/shalee729/kafka/bin/kafka-console-consumer.sh --bootstrap-server zookeeper-01:9092,zookeeper-02:9092,zookeeper-03:9092 --topic peter-01 --partition 0 --from-beginning  
a
d
1
4
$ /home/shalee729/kafka/bin/kafka-console-consumer.sh --bootstrap-server   zookeeper-01:9092,zookeeper-02:9092,zookeeper-03:9092 --topic peter-01 --partition 1 --from-beginning
c
3
$ /home/shalee729/kafka/bin/kafka-console-consumer.sh --bootstrap-server zookeeper-01:9092,zookeeper-02:9092,zookeeper-03:9092 --topic peter-01 --partition 2 --from-beginning
b
e
2
5

메세지 순서 해석

  • 컨슈머는 오직 파티션의 오프셋 기준으로만 메시지를 가져온다
  • 예를 들어 b 메시지는 e 메시지 앞에 있어야 한다.
  • 즉, 카프카 컨슈머 메시지 순서는 동일한 파티션 내에서는 순서에 맞게 처리한다.
  • 하지만 파티션과 파티션 사이에서는 순서를 보장하지 않는다.

결론

  • 카프카를 사용하면서 메시지의 순서를 보장해야 하는 경우에는 토픽의 파티션 수를 1로 설정
  • 다만, 분산해서 처리할 수 없고 하나의 컨슈머에서만 처리할 수 있기 때문에 처리량이 높지 않다.
  • 파티션 수 1로 했을 때 위의 예제


컨슈머 그룹

컨슈머 그룹, 리밸런스

  • 하나의 토픽에서 여러 컨슈머들이 메시지를 가져올 때 사용한다.
  • 메시지를 가져가면 삭제하는 다른 메시징큐 솔루션과 가장 큰 차이점이다.


프로듀서가 전송하는 메시지 속도를 처리하지 못하는 경우?

  • 프로듀서 메시지 전송 속도 > 컨슈머 소비속도 라면?
  • 컨슈머 그룹을 통해 컨슈머를 추가한다
  • 그러면 기존 컨슈머가 가져가고 있던 파티션에서 데이터를 가져오는데
  • 이 때, 소유권이 이동하는 것을 리밸런스라고 한다.
  • 리밸런스 작업이 행해지는 잠시동안 컨슈머 전체 그룹은 사용할 수 없다.


  • 하지만, 파티션의 수 = 컨슈머 그룹 내 컨슈머 수.

컨슈머 그룹 내 컨슈머 하나가 다운된다면?

  • 컨슈머가 오랫동안 하트비트를 보내지 않으면 세션은 타임아웃이 된다.
  • 그 후 컨슈머가 다운된 것으로 판단하고 리밸런스를 시작한다.
  • 기존 파티션 수를 감당하지 못하여 컨슈머를 추가한 경우라면 컨슈머를 하나 추가해주는 것이 좋다.

하나의 토픽에 대해 두 개의 컨슈머 그룹이 사용할 수 있다.

  • 여러 컨슈머 그룹들이 하나의 토픽에서 메시지를 가져갈 수 있는 이유는 컨슈머 그룹마다 각자의 오프셋을 별도로 관리하기 때문이다.
  • 당연히 컨슈머 그룹에 아이디는 중복될 수 없다.


한줄 정리
메시지 순서를 정확하게 유지하려면, 토픽의 파티션 수를 하나로 사용해야 한다.
컨슈머에서 반드시 알아야 하는 것은 오프셋 / 커밋 / 컨슈머 그룹 이다. 컨슈머 옵션 참고하기


참고: 카프카, 데이터 플랫폼의 최강자