아파치 카프카(Apache Kafka)의 컨슈머(Consumer) 파티션(partition)과 메시지 순서[10]

busybean3·2021년 9월 7일
1

카프카

목록 보기
10/13

이번 포스팅을 통해서 컨슈머(Consumer)의 파티션메시지 순서에 대해 알아보겠습니다.

1. 파티션 3개로 구성

일단 파티션과 메시지 순서 메커니즘을 알아보기 위해 생성한 토픽에 파티션 수가 3이고 리플리케이션 팩터 옵션은 1로 설정 후 메시지를 전송해보겠습니다.

1-1. 토픽 생성

## 토픽 생성 명령어
/user/local/kafka/bin/kafka-topics.sh \
--zookeepeer peter-zk001:2181,peter-zk002:2181,peter-zk003:2181/peter-kafka \
--topic peter-01 \
--partitions 3 \
--replication-factor 1 \
--create

1-2. 프로듀서 생성 후 메시지 입력

## 프로듀서 콘솔 명령어
/usr/local/kafka/bin/kafka-console-producer.sh \
--broker-list peter-kafka001:9092,peter-kafka002:9092,peter-kafka003:9092 \
--topic peter-01

입력
> a
> b
> c
> d
> e

## 컨슈머 콘솔 명령어
/usr/local/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server peter-kafka001:9092,peter-kafka002:9092,peter-kafka003:9092 \
--topic peter-01 \
--from-beginning

출력 
a
d
b
e
c

출력을 해본 결과 a부터 순서대로 메시지를 가져오지 않습니다.

1-3. 추가 프로듀서 생성 후 메시지 입력

이번에는 프로듀서로 추가로 메시지를 전송해보겠습니다.

## 프로듀서 콘솔 명령어
/usr/local/kafka/bin/kafka-console-producer.sh \
--broker-list peter-kafka001:9092,peter-kafka002:9092,peter-kafka003:9092 \
--topic peter-01

입력
> 1
> 2
> 3
> 4
> 5


## 컨슈머 콘솔 명령어
/usr/local/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server peter-kafka001:9092,peter-kafka002:9092,peter-kafka003:9092 \
--topic peter-01 \
--from-beginning

출력 
a
d
1
4
b
e
2
5
c
3

같은 토픽에 프로듀서로 추가 메시지를 보내고 확인해본결과 또 순서대로 전송되지 않고 어떻게보면 뒤죽박죽처럼 썪여있습니다.

자칫잘못하면 컨슈머의 오류로 생각할 수 있지만 아닙니다.

1-4. 왜 뒤죽박죽일까?

이제 왜 그런지 알아보겠습니다.

파티션별 컨슈머 확인

## 컨슈머 콘솔 명령어
/usr/local/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server peter-kafka001:9092,peter-kafka002:9092,peter-kafka003:9092 \
--topic peter-01 \
--partition 0
--from-beginning

출력 
b
e
2
5

## 컨슈머 콘솔 명령어
/usr/local/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server peter-kafka001:9092,peter-kafka002:9092,peter-kafka003:9092 \
--topic peter-01 \
--partition 1
--from-beginning

출력 
a
d
1
4

## 컨슈머 콘솔 명령어
/usr/local/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server peter-kafka001:9092,peter-kafka002:9092,peter-kafka003:9092 \
--topic peter-01 \
--partition 2
--from-beginning

출력 
c
3

--partition 옵션으로 각 파티션 별로 메시지가 어떤것들이 저장되어 있는지 확인해본 결과 위와 같습니다.

위의 명령어로 확인 파티션별 쌓여져있는 메시지를 정리해보면 위의 사진과 같습니다.

컨슈머 그룹에서 가져오는 메시지의 순서는 어떤 순서대로 보냈는지는 알 수 없지만 컨슈머는 오직 파티션의 오프셋 기준으로만 메시지를 가져옵니다. 다시말해 컨슈머 그룹에서 오는 메시지 순서는 알 수 없지만 파티션별 메시지의 순서는 오프셋순을 지켜 보내진다는 것 입니다.

( 파티션 0, 파티션 1, 파티션 2 중 어떤 순으로 오는지 모르지만 파티션 0은 오프셋순으로 b->e->2->5 오는 것 입니다.)

카프카 컨슈머에서의 메시지 순서는 동일한 파티션 내에서는 프로듀서가 생성한 순서와 동일하게 처리하지만, 파티션과 파티션 사이에서는 순서를 보장하지 않습니다. 하지만 카프카를 사용하는 사용자에 따라 메시지의 순서를 반드시 보장해야 하는 경우도 있습니다. 이런 경우에는 어떻게 해야하는지 알아보겠습니다.

2. 메시지 순서를 보장하기 위한 파티션 1개로 구성

메시지의 순서를 정확하게 보장받기 위해서는 토픽의 파티션 수를 1로 지정하면 됩니다. 왜그런지는 앞서 설명드린 것과 같이 동일한 파티션내에서는 오프셋순으로 메시지를 가져오기때문입니다.

예를 들어보겠습니다.

2-1. 토픽 생성

## 토픽 생성 명령어
/user/local/kafka/bin/kafka-topics.sh \
--zookeepeer peter-zk001:2181,peter-zk002:2181,peter-zk003:2181/peter-kafka \
--topic peter-01 \
--partitions 1 \
--replication-factor 1 \
--create

2-2. 프로듀서 생성 후 메시지 생성

토픽을 생성한 후 알파벳 a 순으로 메시지를 생성해보겠습니다.

## 프로듀서 콘솔 명령어
/usr/local/kafka/bin/kafka-console-producer.sh \
--broker-list peter-kafka001:9092,peter-kafka002:9092,peter-kafka003:9092 \
--topic peter-01

입력
> a
> b
> c
> d
> e


## 컨슈머 콘솔 명령어
/usr/local/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server peter-kafka001:9092,peter-kafka002:9092,peter-kafka003:9092 \
--topic peter-01 \
--from-beginning

출력 
a
b
c
d
e

확인결과 파티션 한개에서 메시지를 가져오기 때문에 오프셋순으로 가져와 순서대로 메시지를 가져올 수 있게되는것 입니다.

REFERENCE

해당 글의 모든 레퍼런스는 "카프카, 데이터 플랫폼의 최강자" (고승범, 공용준 지음) 을 알립니다.

https://coupa.ng/b5xV58

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

profile
엉덩이 무거운 개발자가 되기 위해서 몸무게를 찌웠다...

0개의 댓글