Kafka에서 메시지는 생산되는데 소비되지 않을 때 가장 먼저 물어야 할 질문은 “offset reset을 해야 하나?”가 아닙니다. “이 consumer group이 실제로 partition을 할당받고 polling을 하면서 offset을 기대한 방식으로 앞으로 보내고 있는가?”가 더 중요합니다. 많은 incident가 offset 문제처럼 보여도 실제로는 assignment, poll loop, rebalance churn 문제인 경우가 많습니다.
이 글은 가장 빠른 점검 순서부터 갑니다. group 상태가 건강한지, consumer가 partition을 할당받는지, consumer loop가 살아 있기만 한 채 실제 polling은 안 하는 건 아닌지부터 확인합니다.
consumer group이 실제로 동작 중인지 먼저 보세요
실무에서 messages not consumed는 보통 아래 중 하나입니다.
- 어떤 consumer도 partition을 할당받지 못함
- consumer group이 불안정함
- consumer는 살아 있지만 polling을 하지 않음
- offset 위치가 운영자가 생각한 것과 다름
그래서 애플리케이션 로그보다 group 상태를 먼저 보는 편이 훨씬 빠를 때가 많습니다.
partition assignment를 확인하세요
Kafka consumer는 partition을 할당받아야 실제 일을 합니다.
메시지는 생산되는데 consumer가 아무것도 못 본다면 먼저 아래를 확인해야 합니다.
- topic이 맞는가
- group에 active member가 있는가
- 그 member들이 partition을 할당받고 있는가
- 관련 partition을 다른 member가 이미 들고 있어 이 consumer가 idle 상태는 아닌가
partition assignment가 없으면 프로세스가 살아 있어도 실질적으로는 아무 일도 못 합니다.
offset보다 poll 동작을 먼저 보세요
Kafka consumer 설정 문서에서 poll()은 consumer lifecycle의 중심입니다.
그래서 멈춘 consumer는 보통 아래 패턴 중 하나로 보입니다.
- group에는 들어가지만 poll을 멈춤
- poll 간격이 너무 길어 rebalance가 발생함
- downstream 처리에 너무 오래 묶임
- commit 전에 실패해서 offset progress가 기대와 다름
group이 불안정해 보인다면 Kafka Consumer Lag Increasing가 가장 직접적인 다음 글입니다.
다른 broker에서의 유사 증상과 비교해보고 싶다면 RabbitMQ Consumers Not Receiving Messages도 좋은 비교점입니다.
offset은 중요하지만 전부는 아닙니다
offset은 중요하지만 그것만으로 상태가 설명되지는 않습니다.
흔한 경우는 아래와 같습니다.
- consumer가 기대한 레코드보다 이미 앞으로 가 있음
auto.offset.reset을 잘못 이해하고 있음- 다른 consumer group은 읽고 있지만 이 group은 아님
- partial work 뒤 commit이 일어나서 레코드를 다시 읽지 않음
즉 메시지가 존재한다와 이 consumer가 지금 그 메시지를 읽는다는 같은 말이 아닙니다.
흔한 원인
1. partition assignment가 없음
group이 비어 있거나 불안정하거나, 다른 곳에 할당되어 있습니다.
2. poll loop가 앞으로 나가지 않음
프로세스는 떠 있지만 active consumer처럼 동작하지 않습니다.
3. offset 기대치가 다름
group의 현재 위치가 운영자의 기대와 다릅니다.
4. rebalance가 진전을 자꾸 끊음
유효한 소비 작업이 반복적으로 중단됩니다.
실전 점검 순서
- topic에 레코드가 실제로 들어오는지 확인
- consumer group membership과 assignment 확인
- consumer loop가 polling 하는지 확인
- offset 위치와 commit 동작 확인
- rebalance 빈도와 처리 latency 확인
이 순서가 offset reset부터 하는 것보다 훨씬 설명력이 좋습니다.
초반 분기에 좋은 shortcut
producer는 active한데 한 group만 아무것도 못 본다면 이렇게 갈라보세요.
- member가 없거나 assignment가 없다: group state부터
- member는 있는데 offset이 안 움직인다: poll behavior부터
- offset이 이미 많이 앞서 있다: offset expectation부터
- assignment가 계속 바뀐다: rebalance churn부터
이 분기만으로도 모든 incident를 offset reset 문제로 착각하는 실수를 줄일 수 있습니다.
증상별 진입 힌트
- producer는 쓰고 있는데 이 consumer group이 아무것도 못 읽는 것 같으면 여기서 시작하면 됩니다.
- 소비는 하는데 lag만 계속 늘면 lag 가이드를 먼저 보세요.
바로 확인할 명령
kafka-consumer-groups.sh --bootstrap-server <broker:9092> --group <group> --describe
kafka-consumer-groups.sh --bootstrap-server <broker:9092> --list
kafka-topics.sh --bootstrap-server <broker:9092> --describe --topic <topic>
이 명령으로 group 존재 여부, partition assignment, offset 이동 여부를 먼저 확인할 수 있습니다.
빈 group인지, assignment가 없는지, producer는 계속 쓰는데 current offset이 멈춰 있는지를 보세요.
FAQ
Q. producer는 정상인데 consumer는 왜 아무것도 못 보나요?
topic 생산, group assignment, offset 위치가 서로 다른 문제이기 때문입니다.
Q. offset reset부터 해야 하나요?
group 상태와 assignment가 맞는지 먼저 확인해야 합니다.
Q. 가장 먼저 무엇을 봐야 하나요?
group membership, partition assignment, poll 동작, 현재 offset 위치입니다.
Read Next
- consumer가 돌아가는데도 뒤처진다면 Kafka Consumer Lag Increasing를 보세요.
- group churn이 assignment와 progress를 끊는다면 Kafka Rebalancing Too Often를 보세요.
- consumer가 살아 있는데 group에서 계속 밀려난다면 Kafka max.poll.interval.ms 트러블슈팅을 보세요.
- 같은 backlog 패턴을 다른 broker에서 비교하고 싶다면 RabbitMQ Consumers Not Receiving Messages를 보세요.
Related Posts
- Kafka Consumer Lag Increasing
- Kafka Rebalancing Too Often
- Kafka max.poll.interval.ms 트러블슈팅
- RabbitMQ Consumers Not Receiving Messages
Sources:
- https://kafka.apache.org/40/configuration/consumer-configs/
- https://kafka.apache.org/42/operations/
- https://kafka.apache.org/36/operations/monitoring/
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: Redis vs RabbitMQ vs Kafka 개발자를 위한 미들웨어 트러블슈팅 허브 글입니다. Redis, RabbitMQ, Kafka 중 어떤 증상부터 먼저 봐야 하는지와 어떤 문제 패턴이 각 시스템에 가까운지 정리합니다.
- Kubernetes CrashLoopBackOff: 먼저 볼 것들 startup failure, probe, config, resource limit 관점에서 CrashLoopBackOff를 어떻게 나눠서 봐야 하는지 정리한 가이드입니다.
- Kafka consumer lag가 계속 늘 때: 트러블슈팅 가이드 Kafka consumer lag가 계속 늘어날 때 무엇부터 봐야 하는지 정리합니다. poll 주기, 처리 속도, rebalance, consumer 설정까지 실전 기준으로 다룹니다.
- Kafka Rebalancing Too Often 가이드 Kafka consumer group에서 rebalance가 너무 자주 일어날 때 membership flapping, poll timing, protocol, assignment churn을 어떤 순서로 봐야 하는지 설명하는 실전 가이드입니다.
- Docker container가 계속 재시작될 때: 먼저 확인할 것들 exit code, command failure, environment mistake, health check 관점에서 Docker restart loop를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.