메시지를 어디까지 읽었는 지 기억하고, 그 다음 메시지부터 처리하기 (Consumer Group, Offset)
JSCODE 박재성
2025-12-06
author
JSCODE 박재성
category
Kafka
createdAt
Dec 6, 2025
series
실전에서 바로 써먹는 Kafka 입문
slug
consumer-group-and-offset
type
post
updatedAt
Dec 6, 2025 05:39 AM
✅ 메시지를 어디까지 읽었는 지 기억하고, 그 다음 메시지부터 처리하기
Kafka에서 컨슈머 그룹(Consumer Group)이라는 개념을 활용하면, 각 컨슈머 그룹(Consumer Group)이 어디까지 메시지를 읽었는지를 오프셋(offset)이라는 번호로 기록해둔다. 이 덕분에 컨슈머 그룹(Consumer Group)에 속해있는 컨슈머(Consumer)들은 안 읽은 메시지부터 순차적으로 메시지를 읽게 된다.
[용어 정리]
컨슈머(Consumer) : 카프카의 메시지를 처리하는 주체
컨슈머 그룹(Consumer Group) : 1개 이상의 컨슈머를 하나의 그룹으로 묶은 단위
오프셋(offset) : 메시지의 순서를 나타내는 고유 번호 (0부터 시작)
그림으로 나타내면 다음과 같다.
토픽에 저장되어 있는 여러 메시지는 메시지의 순서를 나타내는 고유 번호인 오프셋(offset)을 가지고 있다.
오프셋(offset) 번호는 인덱스처럼 0부터 시작한다.
컨슈머 그룹(Consumer Group)은 1개 이상의 컨슈머(Consumer)를 가질 수 있다.
컨슈머 그룹(Consumer Group)은 어디까지 메시지를 읽었는 지에 대한 정보(CURRENT-OFFSET)를 알고 있다.
CURRENT-OFFSET : 다음에 읽을 메시지의 오프셋 번호
지금까지 배운 내용을 실습을 통해 바로 확인해보자.
✅ [실습] 컨슈머 그룹을 지정해서 메시지 읽기
컨슈머 그룹을 지정해서 메시지 읽기
# 컨슈머 그룹을 활용해 메시지 조회하기
$ 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 옵션과 같이 사용했을 경우)
: 컨슈머 그룹의 오프셋 기록이 없으면 첫 메시지부터 읽고, 만약 오프셋 기록이 있으면 그 이후 오프셋부터 메시지를 읽는다.
컨슈머 그룹이 잘 생성됐는 지 확인하기
# 컨슈머 그룹 전체 조회하기
$ bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--list
특정 컨슈머 그룹 세부 정보 조회하기
# 컨슈머 그룹 세부 정보 조회하기
$ bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--group email-send-group \
--describe
CURRENT-OFFSET이 4로 되어 있는 걸 보니, email-send-group이라는 컨슈머 그룹이 오프셋이 0~3인 메시지(hello1, hello2, hello3, hello4)를 읽었고 다음으로 읽을 메시지의 오프셋이 4라는 걸 알 수 있다.
그림으로 나타내면 다음과 같다.
0~3까지의 오프셋 메시지를 읽고나서, 컨슈머 그룹의 CURRENT-OFFSET이 4로 바뀐 모습이다. 즉, 해당 컨슈머 그룹이 다음으로 읽을 메시지의 오프셋이 4라는 걸 뜻한다.
그럼 이번에는 컨슈머 그룹이 안 읽은 메시지부터 순차적으로 메시지를 읽는 지 확인해보자.
✅ [실습] 컨슈머 그룹이 안 읽은 메시지부터 순차적으로 메시지를 읽는 지 확인하기
토픽에 메시지 추가로 넣기
# email.send라는 토픽에 메시지 넣기
$ bin/kafka-console-producer.sh \
--bootstrap-server localhost:9092 \
--topic email.send
# 위 명령어 입력 후 넣을 메시지 내용 입력하고 Enter 누르기
hello5
hello1 ~ hello4 메시지는 읽어들이지 않고, 방금 전에 추가한 hello5 메시지부터 읽어들였다.
컨슈머 그룹 세부 정보 조회하기
# 컨슈머 그룹 세부 정보 조회하기
$ bin/kafka-consumer-groups.sh \
--bootstrap-server localhost:9092 \
--group email-send-group \
--describe
오프셋이 0~4인 메시지(총 5개의 메시지)까지 읽었으므로, CURRENT-OFFSET이 5로 표시되어 있다. 즉, 다음에 읽어야 할 메시지가 오프셋이 5인 메시지라는 뜻이다.
그림으로 나타내면 다음과 같다.
새로 들어온 오프셋이 4인 메시지(hello5)를 읽고나서, 컨슈머 그룹의 CURRENT-OFFSET이 5로 바뀐 모습이다. 즉, 해당 컨슈머 그룹이 다음으로 읽을 메시지의 오프셋이 5라는 걸 뜻한다.
✅ 정리
실제 서비스에서 똑같은 요청을 중복해서 여러번 처리하면 안 된다. 그래서 반드시 컨슈머 그룹(Consumer Group)을 활용해서 메시지를 읽어야 한다. 그래야 컨슈머 그룹이 메시지를 어디까지 읽었는 지 메시지의 오프셋(offset) 값으로 기억해뒀다가, 아직 처리하지 않은 그 다음 메시지부터 처리할 수 있게 된다.