Skip to content

Commit ac760f1

Browse files
committed
docs: 2025-12-21-rabbitmq update
1 parent ceda4b0 commit ac760f1

File tree

7 files changed

+74
-0
lines changed

7 files changed

+74
-0
lines changed

_posts/rabbitmq/2025-12-21-rabbitmq.md

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,77 @@ rabbitmqadmin declare queue name=orders.queue \
5555
```
5656

5757
시스템에서 잘사용하고 있다가 필요로 인해 ttl을 60초에서 120초 변경해야 한다거나 속성을 추가로 해야한다면 **기존 큐를 삭제**했다가 다시 생성해야지만 설정이 가능합니다. 이러한 문제는 메시지 손실이 발생과 애플리케이션 장애로 이어질 수 있기 때문에 RabbitMQ에서는 x-arguments 사용을 권장하지 않고 있습니다.
58+
59+
## 프로젝트에 DLQ 적용
60+
61+
현재 담당하고있는 알림시스템에 DLQ를 적용과정을 상세하게 알아보겠습니다.
62+
63+
### 적용 이유
64+
65+
애플리케이션에서 메시지를 받아 처리할 때 에러가 발생 했을 때 로그를 남기고 있지만 서버를 들어가 로그난 기록을 찾아야하는 시간적 비용이 많이 든다는걸 알았습니다. 이러한 문제점을 해결하기 위해 DLQ를 적용해서 에러난 메시지를 따로 격리하여 모니터링하도록 적용하였습니다.
66+
67+
### 적용 플로우
68+
69+
1. DLQ, DLX 생성
70+
71+
사용하고있는 큐에 DLQ를 적용하기 위해, DLQ와 DLX를 먼저 생성해야 합니다. 큐, 익스체인지 생성과 동일합니다.
72+
73+
![Queue](/assets/img/rabbitmq/2025-12-21-rabbitmq-01.png)
74+
_Queue_
75+
76+
![스크린샷 2025-12-22 오후 3.43.58.png](/assets/img/rabbitmq/2025-12-21-rabbitmq-02.png)
77+
78+
![Exchange](/assets/img/rabbitmq/2025-12-21-rabbitmq-03.png)
79+
_Exchange_
80+
81+
2. 정책 설정
82+
83+
daemonNotiQ에서 실패 메시지를 DLQ로 보내기 위해 아래와 같이 설정했습니다. 애플리케이션에서 에러가 나면 재시도해도 에러가 나기 때문에 재시도 횟수(delivery-limit: 1)는 없이 설정했습니다. 다른 추가 속성이 없기 때문에 컨슈머가 `requeue=false` 옵션으로 메시지를 거부할 때 DLQ로 메시지가 전송됩니다.
84+
85+
```bash
86+
rabbitmqctl set_policy notification-quorum-dlx-policy "^daemonNotiQ$" \
87+
'{ "dead-letter-exchange": "notification.quorum.dlx", "dead-letter-routing-key": "failed", "delivery-limit": 1 }' \
88+
--apply-to quorum_queues --priority 10
89+
```
90+
91+
3. Spring 설정
92+
93+
에러 발생시 흐름은 아래와 같습니다.
94+
95+
```
96+
1. Listener에서 예외 발생
97+
98+
2. ConditionalRejectingErrorHandler.handleError() 호출
99+
100+
3. ExceptionStrategy.isFatal(exception) 확인
101+
102+
YES (Fatal) → AmqpRejectAndDontRequeueException 던짐
103+
NO (Retryable) → 일반 Exception 던짐
104+
105+
4. Spring AMQP가 예외 타입에 따라 처리
106+
- AmqpRejectAndDontRequeueException → reject (requeue=false)
107+
- 일반 Exception → factory.setDefaultRequeueRejected() 설정 따름
108+
109+
5. RabbitMQ 브로커가 DLX 설정 확인
110+
111+
6. DLQ로 메시지 이동
112+
```
113+
114+
이러한 흐름대로 가기 위해서 Spring 기존 로직을 변경해주었습니다.
115+
116+
- `queueListener.process()` 예외 처리
117+
118+
![스크린샷 2025-12-22 오후 4.25.42.png](/assets/img/rabbitmq/2025-12-21-rabbitmq-04.png)
119+
120+
- 에러 발생 시 isFatal변경 하는 클래스 생성
121+
122+
![스크린샷 2025-12-22 오후 4.31.26.png](/assets/img/rabbitmq/2025-12-21-rabbitmq-05.png)
123+
124+
- rabbitMQConfig 파일에 에러 핸들러 추가
125+
126+
![스크린샷 2025-12-22 오후 4.32.10.png](/assets/img/rabbitmq/2025-12-21-rabbitmq-06.png)
127+
128+
129+
## 마치며
130+
131+
DLQ 상세 개념과 실무에서 어떻게 적용했는지 알아보았습니다. DLQ을 적용한지 얼마 안되었기에 정제되지 않는 에러 메시지도 들어 올 수 있지만 필터링 할수 있는 방안과 지속적인 데이터를 모니터링을 통해 다른 정책들도 필요하면 추가할 예정입니다.
24.1 KB
Loading
13.8 KB
Loading
39.5 KB
Loading
54.1 KB
Loading
139 KB
Loading
213 KB
Loading

0 commit comments

Comments
 (0)