기술, 개발/RabbitMQ

Dead Letter Exchange (메세지 만료)

Jaejin Sim 2025. 9. 10. 23:07
반응형

참고 URL

https://www.rabbitmq.com/ttl.html

https://www.rabbitmq.com/dlx.html

메세지가 오랫동안 Queue에 남아 있을 때 message-ttl 설정을 하여 가비지 메세지를 삭제 또는 다른 Queue 에 보낼 수 있음

Dead Letter

  • Queue 선언 할 때 전체 메세지 만료 시간을 세팅 할 수 있고
  • 각 메세지 마다 expiration 옵션을 줘서 메세지를 만료 시킬 수 있다.
KEY VALUE 설명
x-dead-letter-exchange DLX_NaverRouter 죽은 메세지 다른 큐로 보내버릴 exchange 이름
x-message-ttl 5000 (5초) 만료 시간
x-dead-letter-routing-key dlx_naverkey234 라우트 키 까지 설정해줘야 다른 큐로 잘 넘어감

DLX Queue 선언 예시

일반적인 큐 NaverQueue
-> x-dead-letter-exchange = DLX_NaverRouter
-> x-message-ttl = 5000 (5초) -> 초를 많이 늘릴 수 있음 1시간으로? 
-> x-dead-letter-routing-key = dlx_naverkey234 // 키까지 설정해야함

dead letter 받는 큐 -> DLX_NaverQueue
-> 큐는 그냥 일반 큐 생성 하고
-> exchange 바인딩을  잘 설정해야함 

exchange bind
exchange name = DLX_NaverRouter
router key = dlx_naverkey234!
# 설정 
$channel->queue_declare('Queue', false, true, false, false, false, new AMQPTable(
        array(
        'x-dead-letter-exchange' => 'DLX_Router',
        'x-message-ttl' => 5000 , // 5초 
        'x-dead-letter-routing-key' => 'dlx_key234'
        )
    )
);
$channel->exchange_declare('Router', AMQPExchangeType::DIRECT, false, true, false);
$channel->queue_bind('Queue', 'Router');
# DLX_NaverQueue 설정
$channel->exchange_declare('DLX_Router', AMQPExchangeType::DIRECT, false, true, false);
$channel->queue_declare('DLX_Queue', false, true, false, false);
$channel->queue_bind('DLX_Queue', 'DLX_Router', 'dlx_key234');

메세지 별 만료 시간 설정 예시

// 메세지 만료시간 30초 설정
$message = new AMQPMessage("quit", 
                array(
                    'content_type' => 'text/plain', 
                    'delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT, 
                    'expiration' => 30000 
                )
            );

정리 및 테스트 내용

  • message-ttl = 3시간 설정 정상 처리 확인 완료
    • 설정하고자 하는 시간 그대로 처리 가능 할 듯
    • 최대 설정 가능 시간 내용은 확인 못함
  • unacked 메세지는 삭제 대상은 아님
  • ready 상태 메세지만 dlx 취급
반응형