기술, 개발/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 취급
반응형