Search

지연 메시지 플러그인 vs RabbitMQ-native

Tags
rabbitmq
delay
delayed-message-exchange
rabbitmq-native
dead-letter-exchange
Created
2024/05/01 15:58
Created time
2024/05/01 06:58
category
rabbitmq

개요

일전에 공부했던 RabbitMQ의 Dead Letter Queue를 탐색하다가 지연 메시지 큐에 대해 키워드를 접하여 지연 메시지를 처리할 수 있는 방법에 대해서도 알아보게 됨
지연 메시지 큐를 구현하는 방법으로는
1.
지연 메시지 플러그인을 이용
2.
Dead Letter Queue를 이용
2가지 방법이 있다는 것을 알게 됨

지연 메시지 플러그인

동작 방식

지연 메시지 플러그인을 이용하는 메시지는 특정 노드로 유입되고, 노드 내에 존재하는 Erlang Mnesia 테이블에 저장
타이머로 카운트하여 지연된 시간이 지나면 라우팅을 수행

장점

지연 메시지는 디스크에 저장되는 방식을 이용하므로 과도한 메모리 사용을 피하고 노드 재시작에도 살아남을 수 있음

단점

유입된 특정 노드에만 종속된 메시지이므로 (싱글 카피), 디스크 장애 발생 시 지연 메시지는 유실될 수 있으므로, HA 보장 불가
** classic mirrored queue / quorum queue와는 장애 대처 방법이 다름
노드 내 DB에 메시지가 저장되는 구조이므로, row가 많을수록 탐색에 시간을 많이 소모하게 되고 x-delay로 지정한 시간과 다르게 동작할 수 있음
** 15분으로 설정한 지연 시간이 3일 뒤 동작했다는 이슈가 있음
** 딜레이된 어마무시한 메시지들이 발송되지 않고 라우팅 되길 기다렸다가 한 번에 발송될 수도 있음

대안

Dead Letter Queue를 이용하여 RabbitMQ-native하게 구현

RabbitMQ-native

Dead Letter Exchange

기본적으로 Queue에는 x-meesage-ttl을 이용하여 TTL을 설정할 수 있고, 소비되지 않은 메시지에 대해서 Dead Letter Queue로 보낼 수 있도록 x-dead-letter-exchangex-dead-letter-routing-key를 지정할 수 있음
Queue에 넣은 메시지를 정해진 TTL 동안 소비하지 않고, 이에 따라 Dead Letter Queue에 보내지면 처리하는 식으로 구현이 가능
Dead Letter Queue에 해당되는 Listener를 Callback 메서드로 정의하면, TTL이 만료되는 시점에 Callback 메서드를 수행하는 식으로 지연된 형태의 메시지를 처리 가능

구현 방법

Spring 기준으로 아래 글이 굉장히 순차적으로 잘 정리되어 있음