|
| 1 | +--- |
| 2 | +title: "RabbitMQ DLQ 톺아 보기" |
| 3 | +description: "RabbitMQ DLQ가 무엇이고 어떻게 사용하는지에 대해 설명합니다." |
| 4 | +date: 2025-12-21 +00:00:00 |
| 5 | +permalink: /posts/2025-12-21-rabbitmq/ |
| 6 | +mermaid: true |
| 7 | +categories: [Blogging,rabbitmq] |
| 8 | +--- |
| 9 | + |
| 10 | +## 들어가며 |
| 11 | + |
| 12 | +RabbitMQ 서버와 컨슈머서버는 메시지를 처리에 대한 확인(Ack)을 메소드를 통해 통신하고 있습니다. 컨슈머가 메시지 처리에 대한 확인 메서드를 보내기전에 에러가 나면 어떻게 될까요? RabbitMQ에서는 메시지를 보냈지만 소비되지 않았으므로 다시 보내는 작업을 수행합니다. 이렇게 되면 실패된 메시지에 대해 반복 처리 되면서 장애 발생 원인이 될 수 있습니다. |
| 13 | + |
| 14 | +## DLQ란? |
| 15 | + |
| 16 | +RabbitMQ에서는 DLQ(Dead Letter Qeque)를 사용하여 실패처리된 메시지를 따로 큐에 저장하는것을 말하며 저장된 실패된 메시지에 대해 재처리하거나 원인을 분석할 수 있습니다. DLQ을 선언할때는 정책 또는 `x-arguments` 사용하고 있습니다. |
| 17 | + |
| 18 | +### 정책 |
| 19 | + |
| 20 | +RabbitMQ에서는 정책(Policy)으로 사용을 권장하고 있습니다. 정책은 큐, 익스체인지 선택적 속성들을 동적으로 설정하는 선언적 메커니즘입니다. |
| 21 | + |
| 22 | +1. 핵심 구성요소 |
| 23 | + `Policy = 이름 + 패턴 + 정의 + 우선순위 + 적용 대상` |
| 24 | + - 이름: 정책 고유 이름 |
| 25 | + - 패턴: 정규식표현으로 큐/익스체인지 이름 매칭 |
| 26 | + - 정의: 설정할 key-value 쌍 |
| 27 | + - 우선순위: 여러 정책이 매칭될 때 우선순위 결정 |
| 28 | + - 적용 대상: 큐, 익스체인지, 스트림 등 |
| 29 | + |
| 30 | + ```bash |
| 31 | + rabbitmqctl set_policy my-policy \ |
| 32 | + "^orders\." \ |
| 33 | + '{"message-ttl":60000, "max-length":10000}' \ |
| 34 | + --priority 10 \ |
| 35 | + --apply-to queues |
| 36 | + ``` |
| 37 | + |
| 38 | +2. 주요 정책 종류 |
| 39 | + |
| 40 | + | key | value | 설명 | |
| 41 | + |---------------------------------------------| --- | --- | |
| 42 | + | message-ttl | int | 메시지 만료 시간 | |
| 43 | + | max-length | int | 메시지 최대 개수 | |
| 44 | + | dead-letter-exchange<br/>dead-letter-routing-key | string | Dead Letter Exchange | |
| 45 | + | delivery-limit | int | 최대 재전달 횟수(쿼럼큐 전용) | |
| 46 | + |
| 47 | +### `x-arguments` 를 사용을 권장하지 않는 이유 |
| 48 | + |
| 49 | +x-arguments는 익스체인지/큐를 생성할 때 속성을 추가로 설정할 수 있는 값입니다. 만약 orders.queue를 생성할 때 큐의 ttl를 60초, 최대 개수를 10000설정한다고 가정해봅시다. |
| 50 | + |
| 51 | +```bash |
| 52 | +rabbitmqadmin declare queue name=orders.queue \ |
| 53 | + durable=true \ |
| 54 | + arguments='{"x-message-ttl": 60000, "x-max-length": 10000}' |
| 55 | +``` |
| 56 | + |
| 57 | +시스템에서 잘사용하고 있다가 필요로 인해 ttl을 60초에서 120초 변경해야 한다거나 속성을 추가로 해야한다면 **기존 큐를 삭제**했다가 다시 생성해야지만 설정이 가능합니다. 이러한 문제는 메시지 손실이 발생과 애플리케이션 장애로 이어질 수 있기 때문에 RabbitMQ에서는 x-arguments 사용을 권장하지 않고 있습니다. |
0 commit comments