RabbitMQ consumer가 연결되어 있는데도 메시지를 받지 못한다면, 보통 RabbitMQ가 갑자기 멈춘 것이 아닙니다. 실제 트래픽 경로와 queue, binding, consumer state, prefetch 경로가 어긋나 있는 경우가 많습니다.
짧게 말하면, 먼저 메시지가 queue까지 도달하지 못하는 문제인지, queue에는 도달했지만 consumer에게 전달되지 않는 문제인지부터 나눠 봐야 합니다.
publish-path failure와 delivery-path failure를 먼저 나누세요
가장 가치가 큰 첫 분기입니다.
queue에 메시지가 없다면 보통 upstream 문제입니다.
- 잘못된 exchange
- 잘못된 routing key
- binding mismatch
- publisher가 다른 곳으로 보내는 경우
queue에 메시지가 있다면 문제는 delivery나 consumer 쪽에 있습니다.
consumer가 기대한 queue를 실제로 구독했는지 확인하세요
RabbitMQ 문서를 보면 존재하지 않는 queue를 consume하면 channel이 에러와 함께 닫힙니다.
즉 애플리케이션 입장에서는 “연결됐다”고 느껴도 실제 subscription 경로는 건강하지 않을 수 있습니다.
확인할 것은 아래입니다.
- 정확한 queue name
- subscription 성공 여부
- channel이 여전히 열려 있는지
- consumer tag가 유효한지
connection state보다 consumer activity를 보세요
consumer가 연결돼 있어도 아래 이유로 아무 메시지도 못 받을 수 있습니다.
- 다른 consumer가 single active consumer로 동작 중임
- 현재 consumer가 이미 많은 unacked delivery를 들고 있음
- consumer priority 때문에 delivery가 다른 쪽으로 감
그래서 “앱이 연결돼 있다”는 사실만으로는 충분한 건강 신호가 아닙니다.
prefetch 때문에 멀쩡한 consumer가 멈춘 것처럼 보일 수 있습니다
consumer가 이미 자신의 outstanding delivery window를 꽉 채웠다면, connection은 건강해 보여도 RabbitMQ는 더 이상 새 work를 주지 않을 수 있습니다.
그래서 이 글은 RabbitMQ Messages Stuck in unacked나 RabbitMQ Prefetch Guide와 자주 같이 봐야 합니다.
흔한 원인
1. Binding mismatch
메시지가 consumer가 기대하는 queue로 아예 오지 않습니다.
2. 잘못된 queue 또는 닫힌 channel
팀이 생각하는 위치에서 consumer가 실제로 구독 중이 아닙니다.
3. Single active consumer 동작
다른 consumer가 활성 상태라 현재 consumer는 아무것도 받지 못합니다.
4. Unacked 또는 prefetch saturation
consumer가 더 이상 새 delivery를 받을 수 없는 상태입니다.
실전 점검 순서
1. queue에 실제로 메시지가 있는지 확인합니다
없다면 consumer code가 아니라 publish path와 routing부터 봐야 합니다.
2. consumer subscription이 실제로 성공했는지 확인합니다
연결된 앱이라고 해서 healthy subscription이라고 가정하면 안 됩니다.
3. binding과 routing key를 봅니다
메시지가 다른 곳으로 퍼지고 있다면 consumer 튜닝은 아무 도움이 안 됩니다.
4. single-active-consumer와 consumer-priority 동작을 확인합니다
연결된 consumer가 의도적으로 아무것도 못 받는 상황이 있습니다.
5. prefetch와 unacked delivery를 봅니다
밖에서 보기엔 idle 같아도 RabbitMQ 입장에서는 이미 꽉 찬 consumer일 수 있습니다.
바로 확인할 수 있는 명령어
rabbitmqctl list_queues name messages_ready consumers
rabbitmqctl list_bindings
rabbitmqctl list_consumers
이 명령어들로 queue 상태, consumer attachment, routing 경로를 빠르게 확인할 수 있습니다.
실전 기준
이 incident는 “consumer가 연결돼 있나?”보다 “경로 어디에서 delivery가 멈췄나?”로 보기 시작하면 훨씬 쉬워집니다.
보통 경로는 아래 순서입니다.
- publisher
- exchange와 routing key
- binding
- queue
- consumer subscription
- consumer delivery eligibility
어느 단계가 끊겼는지 빨리 찾을수록 해결도 빨라집니다.
하나 더 유용한 질문
consumer가 연결돼 있고 queue에도 메시지가 있다면, 다음 질문은 “RabbitMQ가 delivery를 안 하는가, 아니면 이 consumer가 지금 추가 work를 받을 자격이 없는가?”가 되어야 합니다.
이 질문으로 보통 아래 가지를 빨리 좁힐 수 있습니다.
- consumer가 이미 너무 많은 unacked 메시지를 들고 있음
- single-active-consumer 규칙이나 priority가 delivery를 다른 쪽으로 보냄
- 보고 있는 queue나 binding이 실제 트래픽 queue가 아님
이 질문이 단순한 “왜 RabbitMQ가 멈췄지?”보다 훨씬 더 실전적입니다.
FAQ
Q. consumer가 연결돼 있어도 inactive일 수 있나요?
네. connection state만으로 delivery를 받을 자격이 있다는 뜻은 아닙니다.
Q. queue가 비어 있으면 consumer부터 봐야 하나요?
보통은 아닙니다. publisher, exchange, routing, binding부터 보세요.
Q. 가장 빠른 첫 단계는 무엇인가요?
consumer code를 보기 전에 queue에 메시지가 있는지 확인하세요.
Q. 여러 consumer 중 하나만 못 받으면 무엇을 봐야 하나요?
consumer priority, single-active-consumer 동작, 그리고 그 consumer가 unacked work에 막혀 있는지 보세요.
Read Next
- consumer가 연결돼 있지만 outstanding delivery에 막혀 있다면 RabbitMQ Messages Stuck in unacked를 보세요.
- queue 자체가 계속 커지고 있다면 RabbitMQ Queue Keeps Growing를 보세요.
- 실제 병목이 QoS window처럼 보인다면 RabbitMQ Prefetch Guide를 보세요.
Related Posts
- RabbitMQ Messages Stuck in unacked
- RabbitMQ Queue Keeps Growing
- RabbitMQ Prefetch Guide
- RabbitMQ Connection Blocked
Sources:
- https://www.rabbitmq.com/docs/next/consumers
- https://www.rabbitmq.com/docs/next/consumer-priority
- https://www.rabbitmq.com/tutorials/amqp-concepts
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.
먼저 읽어볼 가이드
검색 유입이 많은 핵심 글부터 이어서 보세요.
- 미들웨어 트러블슈팅 가이드: 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를 푸는 실전 가이드입니다.
심사 대기 중에는 광고 대신 관련 가이드를 먼저 보여줍니다.