본문 바로가기
Kafka

2. Kafka - CLI 환경에서 다양한 방식의 메시지 송/수신 테스트 하기

by #Glacier 2024. 4. 4.

아래의 명령어를 통해 멀티파트 토픽을 만들어보자. 3개의 파티션으로 나눠져있는 토픽을 만든다.

docker exec -it kafka kafka-topics --bootstrap-server localhost:9092 --create --topic multipart-topic --partitions 3

 

토픽을 특정 어플리케이션에서 카프카로 보냄으로써 자동 생성되도록 할 수도 있지만, --create 명령어로 직접적으로 만들어줄 수도 있다.

 

만들었던 토픽에 대해 설명을 보고 싶을 때에는, 이렇게 확인해볼 수 있다.

docker exec -it kafka kafka-topics --bootstrap-server localhost:9092 --describe --topic multipart-topic

 

그러면 아래와 같이 설명이 나온다.

 

또한 도커 컴포즈에 볼륨 마운트 했던 /data/kafka/topics 밑을 보면

 

 

이렇게 3개의 파티션으로 나눠져 있는 토픽과 offset들을 볼 수 있다.

물론 클러스터 환경에서는 저 토픽 3가지가 제각각 다른 카프카로 나누어져 있을 것이다.

다만, 로컬 환경에서 한대의 서버를 토대로 3개의 파티션으로 나눈 것이기 때문에, 같은 곳에 3개로 나누어져 있는 것이다.

 

메시지 송/수신 실습에 앞서 간단하게 producer / broker / consumer의 역할을 설명하면,

 

producer는 어떠한 메시지를 보내는, 즉 메시지를 생산하는 역할이며 여기서 주어진 CLI producer 말고

어떠한 어플리케이션의 로그가 될 수도 있고 다양한 메세지 생산처라면 모두 가능하다.

 

broker는 producer가 생산한 메시지를 브로커의 특정 토픽으로 보내면 그것을 저장해두는 역할을 한다.

 

consumer는 브로커가 가지고 있는 특정 토픽을 "구독" 하여 구독자로서 메세지를 소비하는 역할을 한다.

 

이름에서부터 알 수 있듯이, producer는 생산자이며, broker는 producer와 consumer 사이의 중개자,

consumer는 메시지를 소비하는 소비자이다.

 

이제 이 multipart-topic에 kafak-console-producer와 kafka-console-consumer CLI를 통해

multipart-topic 내부에 메시지를 보내고, 읽는 연습을 해보자.

 

먼저 터미널을 두 개 열고, 하나는 producer 를 실행하고, 다른 하나는 consumer를 실행하여 메세지를 보내보자.

docker exec -it kafka kafka-console-producer --bootstrap-server localhost:9092 --topic multipart-topic
docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --topic multipart-topic

 

producer가 실행된 창에서 연결이 정상적으로 되었으면 

>  이런 형태의 메시지 입력 란이 나올것이다.

 

거기에 HELLO ! What's up Yo! 를 보내보자.

producer terminal
consumer terminal

이렇게 producer가 생산한 메세지가 브로커로 가고, 브로커의 토픽을 구독하면서 메시지를 Polling 해오는 것을 볼 수 있다.

 

만약 토픽 내의 모든 메시지를 다 소비하고 싶다면, --from--beginning 을 통해 처음부터 읽어올 수 있다.

docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --from-beginning --topic multipart-topic

 

만약 파티션이 어떻게 나누어져있는지도 보고싶다면, 아래의 명령어를 치면 된다.

docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --from-beginning --topic multipart-topic --property print.partition=true

 

만약 consumer cli를 열어두지 않고 다시 입력하여 다시 폴링하는 경우에는 효율적으로 읽기 위해 파티션을 묶음으로 읽어온다.

따라서, 위에 있던 내용이 실제 입력 순서라면, 밑에 있는 내용이 읽어올 때의 내용이라는 것이다.

 

즉, 파티션 레벨로 읽어온다는 것은! 순서 보장이 파티션별로 된다는 것이다.

현저히 다른 메시지의 순서

 

그러면 "key"를 가지는 메시지를 보내보자

docker exec -it kafka kafka-console-producer --bootstrap-server localhost:9092 --topic multipart-topic --property key.separator=: --property parse.key=true

 

그러면 이제 메시지를 다시 consumer로 읽어보자.

docker exec -it kafka kafka-console-consumer --bootstrap-server localhost:9092 --topic multipart-topic \
	--property print.key=true \
	--property print.value=true \
	--property print.partition=true \
	--from-beginning

 

 

어떤 결과가 보일까?

"같은 Key를 가지고 메시지를 보내면, 동일한 파티션으로 메시지를 보낼 수 있다." 라는 점이다.

 

키가 없는 경우 그러면 파티션은 어떻게 정해지는 걸까? 그것은 다음 번에 학습한다!


카프카 명령어 정리 (도커 컨테이너로 실행된 카프카)

카프카 토픽스로 특정 토픽 생성하기

docker exec -it kafka kafka-topics --bootstrap-server 카프카IP:9092(기본포트) --create --topic 토픽명 --partitions 파티션수

 

카프카 콘솔 프로듀서로 특정 토픽에 메시지 보내기

docker exec -it kafka kafka-console-producer --bootstrap-server 카프카IP:9092(기본포트) --topic 토픽명

 

카프카 콘솔 컨슈머로 특정 토픽 읽기

docker exec -it kafka kafka-console-consumer --bootstrap-server 카프카IP:9092(기본포트) --topic 토픽명

 

카프카 토픽스로 특정 토픽 상세보기

docker exec -it kafka kafka-topics --bootstrap-server 카프카IP:9092(기본포트) --describe --topic 토픽명

 

카프카 콘솔 컨슈머로 특정 토픽 처음부터 읽기

docker exec -it kafka kafka-console-consumer --bootstrap-server 카프카IP:9092(기본포트) --from-beginning --topic 토픽명

 

카프카 콘솔 컨슈머로 특정 토픽 처음부터 읽으면서, 파티션 분배 내용도 보기

docker exec -it kafka kafka-console-consumer --bootstrap-server 카프카IP:9092(기본포트) --from-beginning --topic 토픽명 \

 --property print.partition=true

 

카프카 콘솔 프로듀서로 특정 토픽에 키 값을 가지는 메세지를 보내기

docker exec -it kafka kafka-console-producer --bootstrap-server 카프카IP:9092(기본포트) --topic 토픽명 \

--property key.separator=: \

--property parse.key=true

 

카프카 콘솔 컨슈머로 특정 토픽을 처음부터 읽으면서, 키, 값, 파티션 내용 보기

docker exec -it kafka kafka-console-consumer --bootstrap-server 카프카IP:9092(기본포트) --topic 토픽명 \
--property print.key=true \
--property print.value=true \
--property print.partition=true \
--from-beginning