RabbitMQ ‐ Consumer 간 작업 분배 - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 Work Queues : Competing Consumers Pattern

스크린샷 2025-02-06 오후 2 42 53

  • RabbitMQ Tutorials Docs
  • 메세지를 여러 소비자 간에 분배하여 작업을 분산 처리하는 구조
  • 작업 부하를 효율적으로 분산하고 병렬 처리를 가능하게 만들어 처리 속도를 향상 시킨다.
    • RR 방식과 Fair Dispatch 방식을 사용하여 메시지를 Consumer 간에 분배
    • Fair Dispatch 방식은 메시지 수동 확인 모드로 개발하고 메시지 처리 비중 설정 등을 통해 조정 가능

[ 주요 특징 ]

  1. 경쟁적인 메시지 소비 : 여러 Consumer가 동일한 메시지 큐에서 가져가 처리, 특정 메시지는 한 번에 하나의 Consumer에 의해 처리되므로 메시지 중복 처리 방지
  2. 작업 분산 : 메시지가 여러 Consumer 간에 분배되어 병렬로 처리되므로 작업 부하를 효율적으로 분산
  3. 확장성 : Consumer를 추가하거나 제거함으로써 작업 능력을 동적으로 확장하거나 축소
  4. 내결함성 : Consumer 중 하나가 실패하더라도 다른 Consumer가 작업을 이어받아 처리할 수 있어 시스템 중단없이 작동

[ 상태 체크 ]

  • ready
    • 메시지가 큐에 있지만 아직 컨슈머에게 전달되지 않은 상태
    • 이 상태 메시지는 대기 중이며 컨슈머가 연결되면 전달할 준비가 됨
    • 큐의 적재량이 많아지면 ready 메시지 수가 증가
  • unacked
    • 메시지가 컨슈머에게 전달은 되었는데 아직 확인되지 않은 상태
    • 컨슈머가 메시지를 처리하고 확인을 보내면 RabbitMQ는 해당 메시지를 삭제
    • 컨슈머가 확인을 보내지 못하거나 연결이 끊어지면 메시지는 다시 ready 상태로 돌아감

[ 메시지 삭제 ]

  • purge
    • 큐에 있는 ready 메시지를 삭제
    • 삭제된 메시지 복구되지 않으며 데이터는 소실됨
    • unacked 메시지는 purge로 삭제 불가
    • unacked 메시지를 삭제하려면 컨슈머가 연결을 끊거나 RabbitMQ를 재시작
    • 컨슈머가 연결을 끊으면 unacked 메시지는 ready로 돌아감

[ 문제 해결 방법 ]

  • ready가 많다면? → 컨슈머 수를 늘리거나 메시지 처리 속도를 최적화
  • unacked가 많다면? → 컨슈머 코드 수정, 컨슈머 연결 상태를 확인하여 재연결 혹은 재시작