[RabbitMQ] Retry Mechanism with Spring Boot

2021. 11. 3. 11:14 Spring Cloud/RabbitMQ

이번 글에서는 Spring Boot의 RabbitMQ Retry mechanism에 대해 알아보겠습니다.

0. Retry Mechanism이란?

메시지 처리에 실패했을때 실패한 메시지에 대한 error handling 방법을 구조화한 structure 입니다.

이전 retry mechanism 글(https://velog.io/@minholee_93/RabbitMQ-Retry-Mechanism-nik4tel6hs) 에서는 wait exchange와 retry exchange를 직접 구현해 아래와 같은 구조로 retry mechanism을 설계했었습니다.

하지만, Spring boot에서 제공해주는 기능을 사용하면 wait/retry 없이 간단한 구조로 retry mechanism을 구현할 수 있습니다.

1. application.yml

application.yml을 열어 아래와 같은 config만 추가해주면 됩니다.

spring: rabbitmq: listener: simple: retry: enabled: true initial-interval: 3s max-interval: 10s max-attempts: 5 multiplier: 2

위의 내용을 해석해보면 아래와 같습니다.

  1. enabled : spring boot의 retry mechanism을 사용하겠다.
  2. initial-interval : 처음 메세지 처리 실패시 N초 후에 다시 해당 메세지를 처리하겠다.
  3. max-interval : 최대 N초 후에 실패한 메세지를 처리하겠다.
  4. max-attempts : 최대 N번까지만 메세지 처리를 시도하겠다. 만약 N을 넘어가면 해당 메세지는 dlx exchange로 넘긴다.
  5. multiplier : 동일 메세지에 대한 처리 시도 횟수가 증가할 수록 interval 시간에 N을 곱한다. 예를 들어 처음엔 3초를 기다린 후 재시도했다면 다음 횟수에서는 6초를, 다음 횟수에서는 12초를 기다린 후 메세지 처리를 시도한다. 만약 initial-interval * multiplier > max-interval 일 경우에는 max-interval 값을 사용한다.

😎 쉽다!!

2. 단점

위와 같이 config만 등록해주면, 손쉽게 retry mechanism을 구현할 수 있지만 단점도 존재합니다.

spring의 retry mechanism을 사용하면, 설정한 max-attempts 동안에는 메세지가 처리되지 않을 경우 동일 메세지를 반복적으로 처리합니다. 만약, interval을 1분으로 설정하고 최대 3번을 시도할 경우 다음 메세지(B)는 처리되기 위해 3분이라는 시간을 기다려야합니다.

따라서 위의 구조가 적합한 어플리케이션 환경일 경우 사용해도 무방하지만, 만약 실시간으로 지체없이 메세지를 처리해야하는 환경이라면 기존처럼 wait/retry exchange를 직접 구현하여 사용해야 합니다.


참고 자료 : https://www.udemy.com/course/rabbitmq-java-spring-boot-for-system-integration/