3-1. Kafka의 핵심 요소와 작동 (Topic, Consumer, Producer, Consumer Group, OffSet, CURRENT OFFSET) (+ 실습)

2025. 11. 21. 22:02·개발 공부/kafka

Kafka의 기본 구성

kafka의 기본 도식도

  • Producer: Kafka에 메시지(데이터)를 전달하는 주체
  • Consumer: Kafka에 메시지(데이터)를 처리하는 주체
  • Topic: Kafka에 넣을 메시지의 종류를 구분하는 개념 (카테고리와 비슷)

작동 과정

  1. Producer가 Kafka로 메시지를 전달한다.
  2. Kafka는 메시지 큐에 Topic 별로 구분해 전달 받은 메시지를 저장해둔다.
  3. 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) 값으로 기억해뒀다가, 아직 처리하지 않은 그 다음 메시지부터 처리할 수 있게 된다.

 

출처: https://inf.run/qzJua

저작자표시 (새창열림)

'개발 공부 > 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
'개발 공부/kafka' 카테고리의 다른 글
  • 4. Kafka의 Producer, Consumer 서버 만들기 (feat. Spring) (+실습)
  • 3-2. Kafka 토픽 네이밍 규칙
  • 2. Kafka 간단히 설치해보기 (feat. EC2) (+실습)
  • 1. Kafka와 메시지큐 (정의, 형태)
Jamey
Jamey
  • Jamey
    컴공 대학생의 이야기
    Jamey
  • 전체
    오늘
    어제
    • 분류 전체보기 (36)
      • 개발 공부 (33)
        • k8s (24)
        • kafka (8)
        • AI (1)
      • 개발기 (2)
      • 프로젝트 홍보 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    조인 쿼리
    sql자동화
    Rag
    AI
    카프카
    consumer
    Jenkins
    토픽
    llm최적화
    current offset
    cloudflare workers
    Producer
    Kubernetes
    Kafka
    Linux
    serialDB
    Graphana
    K8S
    topic
    langchain
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Jamey
3-1. Kafka의 핵심 요소와 작동 (Topic, Consumer, Producer, Consumer Group, OffSet, CURRENT OFFSET) (+ 실습)
상단으로

티스토리툴바