큐를 쌓는 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-exchange와 x-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 옵션을 주면 된다 !
'etc' 카테고리의 다른 글
사내 디자인 시스템 사용기 (1) | 2023.12.07 |
---|---|
youthcon 2023 발표 (0) | 2023.12.07 |
mac 꿀팁 🧞♂️ (0) | 2022.04.12 |