Kafka의 기본 구성

- Producer: Kafka에 메시지(데이터)를 전달하는 주체
- Consumer: Kafka에 메시지(데이터)를 처리하는 주체
- Topic: Kafka에 넣을 메시지의 종류를 구분하는 개념 (카테고리와 비슷)
작동 과정
- Producer가 Kafka로 메시지를 전달한다.
- Kafka는 메시지 큐에 Topic 별로 구분해 전달 받은 메시지를 저장해둔다.
- Consumer는 주기적으로 Kafka에 새로운 메시지가 생겼는 지 확인하다가, 새로운 메시지가 있다면 가져와서 처리한다.
참고로 Topic은 Kafka에 기존에 저장되어있는 것이 아니라 Producer가 토픽, 메시지와 같이 전달한다.
기존 메시지 큐와 Kafka의 메시지 처리의 차이
- 기존 메시지 큐는 메시지를 읽어들이면 큐 안에 있는 메시지를 없애지만 Kafka는 없애지 않는다.
- 이로 인해 Kafka는 메시지를 여러 번 읽는 것이 가능하지만 실제 서비스에서는 대부분 이미 처리한 메시지를 또 처리하기를 바라지 않는다.
메시지를 어디까지 읽었는 지 확인을 위한 요소들

용어 정리
- 컨슈머(Consumer) : 카프카의 메시지를 처리하는 주체
- 컨슈머 그룹(Consumer Group) : 1개 이상의 컨슈머를 하나의 그룹으로 묶은 단위
- 오프셋(offset) : 메시지의 순서를 나타내는 고유 번호 (0부터 시작)
설명
- 토픽에 저장되어 있는 여러 메시지는 메시지의 순서를 나타내는 고유 번호인 오프셋(offset)을 가지고 있다. (offset은 0부터 시작한다.)
- 컨슈머 그룹(Consumer Group)은 어디까지 메시지를 읽었는 지에 대한 정보(CURRENT-OFFSET)를 알고 있다.
- CURRENT-OFFSET : 다음에 읽을 메시지의 오프셋 번호
- 각 Consumer Group이 어디까지 읽었는지를 offset으로 기록해놓는다. (CURRENT-OFFSET)
- 컨슈머 그룹에 속하는 컨슈머들은 안 읽은 메시지부터 순차적으로 메시지를 읽게 된다. (CURRENT-OFFSET부터 읽음)

- 만약 Consumer Group이 메시지를 4까지 읽었다면 CURRENT-OFFSET이 5가 되면서 다음에 읽으면 CURRENT-OFFSET을 참고해서 5부터 읽게 된다.
실습

- 위에서 Spring 서버로 Producer와 Consumer를 설명하였지만 CLI로도 조작 가능하다.
- 이를 활용하여 실습을 진행할 것임
- 실습을 진행할 때 폴더 위치를 잘 봐주세요
- 현재는 kafka 폴더 안에서 진행합니다. kafka 폴더 안 인지 그리고 해당 폴더 안에 bin 폴더가 존재하는 지를 확인한 후 해당 실습을 진행하여 주세요!
- 이전 실습에 이어서 진행할 것 이기에 AWS EC2에 아직 Kafka를 설치하지 않았다면 이전 게시글인 "2. Kafka 간단히 설치해보기 (feat. EC2) (+ 실습)"을 진행하고 와주세요
2. Kafka 간단히 설치해보기 (feat. EC2) (+ 실습)
환경 세팅 전 갖추어야할 것AWS 계정적당한 성능의 EC2이번 실습은 AWS 프리티어에서 진행하기 위해 EC2 t2.micro (메모리 1GB)에서 진행함EC2에 Kafka 설치 / 실행하기1. JDK 17 설치하기Kafka를 실행시키려
student-developer-story.tistory.com
Topic 생성하고 메시지 넣어보며 Consumer가 읽은 후에도 메시지 남아있는 지 확인해보기
1. 토픽 생성
# email.send라는 토픽 생성
bin/kafka-topics.sh \
--bootstrap-server localhost:9092 \
--create --topic email.send
2. Kafka의 특정 토픽에 메시지 넣기
- Kafka에 넣는 메시지는 Key-Value 형태로 넣을 수도 있고, Key는 생략한 채로 Value만 넣을 수도 있다. 우선 Key를 생략한 채로 Value만 넣는 방식을 배워보자.
# email.send라는 토픽에 메시지 넣기
bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic email.send
# 위 명령어 입력 후 넣을 메시지 내용 입력하고 Enter 누르기
hello1
hello2
hello3
# 입력 다 했으면 Ctlr + c로 입력 상태 종료하기

3. 특정 토픽에 쌓인 메시지 전부 조회하기 + 실시간으로 메시지 조회하기
# email.send라는 토픽에 있는 메시지 꺼내기
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic email.send \
--from-beginning # 토픽에 저장된 가장 처음 메시지부터 출력해온다.

4. 토픽에 메시지 추가하기
bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic email.send
# 위 명령어 입력 후 넣을 메시지 내용 입력하고 Enter 누르기
hello4
5. 메시지를 다시 읽어올 수 있는 지 확인하기
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic email.send \
--from-beginning

- 처음부터 읽어지는 것을 보면 Consumer에서 메시지를 소비한 후에도 Kafka의 메시지는 안 지워진다는 것을 알 수 있다.
Kafka에 Topic을 생성하고 메시지를 순차적으로 읽는 지 확인해보기 (실습)
1. 컨슈머 그룹을 지정해서 메시지 읽기
# 컨슈머 그룹을 활용해 메시지 조회하기
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic email.send \
--from-beginning \ # 이미 읽은 적이 있으면 무시 됨
--group email-send-group
- --group email-send-group : 기존에 `email-send-group`이라는 컨슈머 그룹이 없었다면 `email-send-group`이라는 컨슈머 그룹을 생성한다. 또한, 몇 번째 메시지까지 읽었는 지를 오프셋 번호로 저장해둔다.
- --from-beginning (--group 옵션과 같이 사용했을 경우) : 컨슈머 그룹의 오프셋 기록이 없으면 첫 메시지부터 읽고, 만약 오프셋 기록이 있으면 그 이후 오프셋부터 메시지를 읽는다.
처음 했을 때

다시 했을때

- email-send-group이라는 consumer group이 이미 읽었기 때문에 다시 못 읽는 모습을 볼 수 있음

- 이와 같은 상태가 되었다고 볼 수 있음
2. 컨슈머 그룹이 잘 생성됐는 지 확인하기
# 컨슈머 그룹 전체 조회하기
bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--list

3. 특정 컨슈머 그룹 세부 정보 조회하기
# 컨슈머 그룹 세부 정보 조회하기
bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--group email-send-group \
--describe

- 4까지 읽었기 때문에 CURRENT-OFFSET이 4인 것을 볼 수 있음
4. 토픽에 메시지 추가로 넣기
# email.send라는 토픽에 메시지 넣기
bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic email.send
# 위 명령어 입력 후 넣을 메시지 내용 입력하고 Enter 누르기
hello5
5. 이전에 사용했던 컨슈머 그룹으로 메시지 읽기
bin/kafka-console-consumer.sh \
--bootstrap-server localhost:9092 \
--topic email.send \
--group email-send-group \
--from-beginning

- hello5만 나오는 모습을 볼 수 있음
6. 컨슈머 그룹 세부 정보 다시 조회해보기
# 컨슈머 그룹 세부 정보 조회하기
bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--group email-send-group \
--describe

- CURRENT-OFFSET이 5로 올라간 모습을 볼 수 있음
정리
- 실제 서비스에서 똑같은 요청을 중복해서 여러번 처리하면 안 된다.
- 그래서 반드시 컨슈머 그룹(Consumer Group)을 활용해서 메시지를 읽어야 한다.
- 그래야 컨슈머 그룹이 메시지를 어디까지 읽었는 지 메시지의 오프셋(offset) 값으로 기억해뒀다가, 아직 처리하지 않은 그 다음 메시지부터 처리할 수 있게 된다.
'개발 공부 > kafka' 카테고리의 다른 글
| 5. Kafka 메시지 처리 실패 시 대처 방법 (feat. Spring) (DLT, 재시도) (+실습) (0) | 2025.11.24 |
|---|---|
| 4. Kafka의 Producer, Consumer 서버 만들기 (feat. Spring) (+실습) (0) | 2025.11.23 |
| 3-2. Kafka 토픽 네이밍 규칙 (0) | 2025.11.21 |
| 2. Kafka 간단히 설치해보기 (feat. EC2) (+실습) (0) | 2025.11.20 |
| 1. Kafka와 메시지큐 (정의, 형태) (0) | 2025.11.20 |