RabbitMQ ‐ DeadLetterQueue와 DeadLetterExchange - dnwls16071/Backend_Study_TIL GitHub Wiki
📚 DeadLetterQueue와 DeadLetterExchange
- DLQ : 메시지가 큐에서 제대로 처리 되지 못할 경우 DLQ에 의해 이동되며, 실패한 메시지를 저장하는 용도로 사용
- NACK : 처리나 거부
- TTL 만료 : 메시지 TTL이 만료된 경우 DLQ로 이동
- 큐 설정 초과(오버플로우) : 큐에 설정된 최대 메시지 갯수를 초과하면 가장 오래된 메시지가 삭제되고 DLQ로 이동
- DLX : 큐 실패시에 DLX를 통해 메시지가 처리되지 못한 경우 지정된 큐로 이동시킬 수 있다.
📚 RetryTemplate을 통한 간편한 재처리 설정 방법
- RetryTemplate
- Spring AMQP는 RetryTemplate을 통해 재시도 로직을 지원한다.
- 최대 3번 재시도 후에도 실패하면 Spring이 메시지를 DLQ로 이동시킨다.
- AcknowledgeMode.AUTO
- 재시도 중 메시지가 성공적으로 처리되면 Spring AMQP가 자동으로 Ack 전송
- 모든 재시도가 실패하면 Nack를 보내고 RabbitMQ가 메시지를 DLQ로 이동
- DLQ에서 메시지 수정한 뒤 원래 큐로 재전송하여 정상 처리
@Configuration
public class RetryConfig {
@Bean
public RetryTemplate retryTemplate() {
RetryTemplate retryTemplate = new RetryTemplate();
// 재시도 정책 설정 : 최대 3번 시도
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(3);
// 백오프 정책 설정 : 재시도 간격 1초
FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
backOffPolicy.setBackOffPeriod(1000L);
retryTemplate.setRetryPolicy(retryPolicy);
retryTemplate.setBackOffPolicy(backOffPolicy);
return retryTemplate;
}
}