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;
	}
}