본문 바로가기

etc

RabbitMQ 지연큐 적용하기

큐를 쌓는 api를 개발했는데, 한번의 호출에 N개의 큐가 쌓여진다.

이때 N의 수가 클 경우 큐가 너무 많이 쌓여졌고 컨슈머 쪽에서 처리량이 너무 많아지고 악순환을 만들어냈다.

이를 해결하기 위해 주어진 미션은 다음과 같다.

 

🧡 미션

큐에 쌓을때 (M, M*2, M*3, ..., M*N )초의 지연을 주자. 

예를 들어 M을 5초로 잡았을때, 한번의 api 에서 4개의 큐가 쌓이게 되면 지연을 5초, 10초, 15초, 20초 간격으로 줘야 한다

 

🧡 구현 방법

먼저 지연 시간 전 값을 저장할 임시 큐와, 지연 시간 이후 실제 consumer가 값을 읽어고 처리할 real 큐가 필요하다.

temp Q에서 만료시간이 끝나면 real Q로 값을 넣어줘야 한다. 이 기능은 rabbitMQ 에서 x-dead-letter-exchangex-dead-letter-routing-key로 구현 할 수 있다.

즉 expire 될때 x-dead-letter-routing-key를 사용하여 x-dead-letter-exchange에 값을 넣어주는 것이다.

 

하나씩 설정해보자 !

 

1. exchange 등록

먼저 값을 넘겨줄 exchange(x-dead-letter-exchange값)를 하나 만들어줘야 한다. (기존에 default로 있는걸 사용해도 된다.)

해당 exchange에 x-dead-letter-routing-key로 설정한 key로 값이 들어올 경우 real Q로 가도록 binding 값을 등록해주자

 

그럼 COLLECT_QUEUE에서는 아래 처럼, 해당 exchange 에서 'collect'를 key로 들어오는 메시지를 받게 된다.

 

2. x-dead-letter-exchange & x-dead-letter-routing-key 설정

메시지가 만료될때 위 exchange에 값을 publishing 하는 temp Q를 만들자.

어드민에서 다음처럼 arguments를 넣어주면 된다

 

3. expire time 적용하기

expire time은 temp Q에 publishing 할때 expiration 옵션을 주면 된다 !

https://www.rabbitmq.com/ttl.html

반응형

'etc' 카테고리의 다른 글

사내 디자인 시스템 사용기  (1) 2023.12.07
youthcon 2023 발표  (0) 2023.12.07
mac 꿀팁 🧞‍♂️  (0) 2022.04.12