@cargolift-cdi/util-rabbitmq 0.2.29 → 0.2.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -104,10 +104,15 @@ Header `x-dlq-enriched` indica `1` (sucesso) ou `0` (fallback raw).
|
|
|
104
104
|
| `RABBITMQ_UNROUTABLE_QUEUE` | Nome da fila de unroutable (sem prefixo) | `unroutable` |
|
|
105
105
|
| `RABBITMQ_RETRY_POLICY_SHORT_MS` | TTL retry curto | `120000` |
|
|
106
106
|
| `RABBITMQ_RETRY_POLICY_LONG_MS` | TTL retry longo | `3600000` |
|
|
107
|
+
| `RABBITMQ_QUEUE_TYPE` | Tipo das filas principais (`classic` ou `quorum`) | `quorum` |
|
|
108
|
+
| `RABBITMQ_RETRY_QUEUE_TYPE` | Tipo das filas de retry (herda o principal se vazio) | `quorum` |
|
|
109
|
+
| `RABBITMQ_DELIVERY_LIMIT` | Máximo de entregas antes de enviar para a DLX (quorum) | `0` (desativado) |
|
|
110
|
+
| `RABBITMQ_QUORUM_INITIAL_GROUP_SIZE` | Tamanho inicial do grupo quorum | `0` (valor padrão do cluster) |
|
|
107
111
|
|
|
108
112
|
Notas:
|
|
109
113
|
- As variáveis com sufixo “preferencial” são a convenção nova. As chaves “compat” continuam funcionais para serviços existentes.
|
|
110
114
|
- `RabbitMQTopologyService` usa estas variáveis para criar: AE (fanout), DLX (topic), retries (topic) e filas `integration.<system>.*` com DLQ e binds.
|
|
115
|
+
- Filas agora são criadas como `quorum` por padrão (inclusive DLQ e retries). Ajuste as variáveis acima caso precise manter filas clássicas em ambientes limitados.
|
|
111
116
|
|
|
112
117
|
## Boas Práticas
|
|
113
118
|
- Reutilize a instância injetada (não crie manualmente o publisher baixo nível).
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
type RabbitMQQueueType = "classic" | "quorum";
|
|
1
2
|
interface RabbitMQTopologyRetry {
|
|
2
3
|
short: string;
|
|
3
4
|
long: string;
|
|
@@ -17,6 +18,10 @@ export interface RabbitMQTopology {
|
|
|
17
18
|
policy_short_ms: number;
|
|
18
19
|
policy_long_ms: number;
|
|
19
20
|
};
|
|
21
|
+
queueType?: RabbitMQQueueType;
|
|
22
|
+
retryQueueType?: RabbitMQQueueType;
|
|
23
|
+
deliveryLimit?: number;
|
|
24
|
+
quorumInitialGroupSize?: number;
|
|
20
25
|
}
|
|
21
26
|
export interface RabbitMQTopologyQueue {
|
|
22
27
|
queue: string;
|
|
@@ -42,6 +47,10 @@ export declare class RabbitMQTopologyService {
|
|
|
42
47
|
* Cria filas por sistema e faz binds necessários. Para inbound, cria filas de retry com TTLs.
|
|
43
48
|
*/
|
|
44
49
|
setupQueue(topology: RabbitMQTopology): Promise<string>;
|
|
50
|
+
private assertPrimaryQueues;
|
|
51
|
+
private bindDeadLetterQueue;
|
|
52
|
+
private assertRetryQueues;
|
|
53
|
+
private buildQueueArguments;
|
|
45
54
|
}
|
|
46
55
|
export {};
|
|
47
56
|
//# sourceMappingURL=rabbitmq-topology.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-topology.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-topology.service.ts"],"names":[],"mappings":"AAGA,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,iBAAiB,CAAC,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,kBAAkB,CAAC,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF,KAAK,CAAC,EAAE;QACN,SAAS,EAAE,qBAAqB,CAAC;QACjC,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;
|
|
1
|
+
{"version":3,"file":"rabbitmq-topology.service.d.ts","sourceRoot":"","sources":["../src/rabbitmq-topology.service.ts"],"names":[],"mappings":"AAGA,KAAK,iBAAiB,GAAG,SAAS,GAAG,QAAQ,CAAC;AAY9C,UAAU,qBAAqB;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAChC,iBAAiB,CAAC,EAAE;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;IACF,kBAAkB,CAAC,EAAE;QACnB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IAEF,KAAK,CAAC,EAAE;QACN,SAAS,EAAE,qBAAqB,CAAC;QACjC,eAAe,EAAE,MAAM,CAAC;QACxB,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC;IAEF,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sBAAsB,CAAC,EAAE,MAAM,CAAC;CAGjC;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,WAAW,CAAC,EAAE,qBAAqB,CAAC;CACrC;AAOD;;;;GAIG;AACH,qBACa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;IAEnE;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+C9D;;OAEG;IACG,UAAU,CAAC,QAAQ,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;YAkC/C,mBAAmB;YAwCnB,mBAAmB;YAgBnB,iBAAiB;IAqD/B,OAAO,CAAC,mBAAmB;CAwB5B"}
|
|
@@ -7,6 +7,10 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
7
7
|
var RabbitMQTopologyService_1;
|
|
8
8
|
import { Injectable, Logger } from "@nestjs/common";
|
|
9
9
|
import { getRabbitConnectionManager } from "./rabbitmq-connection.manager.js";
|
|
10
|
+
const DEFAULT_QUEUE_TYPE = "quorum"; // resolveQueueType(getEnv("RABBITMQ_QUEUE_TYPE"));
|
|
11
|
+
const DEFAULT_RETRY_QUEUE_TYPE = "quorum"; // resolveQueueType(getEnv("RABBITMQ_RETRY_QUEUE_TYPE"), DEFAULT_QUEUE_TYPE);
|
|
12
|
+
const DEFAULT_DELIVERY_LIMIT = 0; // toInt(getEnv("RABBITMQ_DELIVERY_LIMIT"), 0);
|
|
13
|
+
const DEFAULT_QUORUM_GROUP_SIZE = 0; // toInt(getEnv("RABBITMQ_QUORUM_INITIAL_GROUP_SIZE"), 0);
|
|
10
14
|
/**
|
|
11
15
|
* RabbitMQTopologyService
|
|
12
16
|
* Padroniza criação de exchanges, DLX, AE e filas dinâmicas por sistema.
|
|
@@ -64,66 +68,21 @@ let RabbitMQTopologyService = RabbitMQTopologyService_1 = class RabbitMQTopology
|
|
|
64
68
|
*/
|
|
65
69
|
async setupQueue(topology) {
|
|
66
70
|
const ch = await getRabbitConnectionManager().createChannel();
|
|
71
|
+
const queueType = topology.queueType ?? DEFAULT_QUEUE_TYPE;
|
|
72
|
+
const retryQueueType = topology.retryQueueType ?? DEFAULT_RETRY_QUEUE_TYPE;
|
|
73
|
+
const deliveryLimit = topology.deliveryLimit ?? DEFAULT_DELIVERY_LIMIT;
|
|
74
|
+
const quorumGroupSize = topology.quorumInitialGroupSize ?? DEFAULT_QUORUM_GROUP_SIZE;
|
|
67
75
|
try {
|
|
68
76
|
for (const queue of topology.queues) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
// x-dead-letter-exchange: (inbound.dlx)
|
|
76
|
-
// x-dead-letter-routing-key: (integration.sistema.dead)
|
|
77
|
-
await ch.assertQueue(queue.queue, {
|
|
78
|
-
durable: true,
|
|
79
|
-
arguments: {
|
|
80
|
-
"x-dead-letter-exchange": topology.deadLetterExchange?.exchange || "",
|
|
81
|
-
"x-dead-letter-routing-key": queue.deadLetterQueue?.routingKey,
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
catch (e) {
|
|
86
|
-
const msg = String(e?.message ?? e ?? "");
|
|
87
|
-
if (/PRECONDITION[_-]FAILED|inequivalent arg/i.test(msg)) {
|
|
88
|
-
// Sinaliza claramente drift de topologia
|
|
89
|
-
throw new Error(`RabbitMQ topology drift: ${msg}. Filas de retry existentes para '${queue.queue}' com TTL/args diferentes dos configurados. Alinhe variáveis ou remova filas manualmente.`);
|
|
90
|
-
}
|
|
91
|
-
throw e;
|
|
92
|
-
}
|
|
77
|
+
await this.assertPrimaryQueues(ch, queue, {
|
|
78
|
+
queueType,
|
|
79
|
+
quorumGroupSize,
|
|
80
|
+
deliveryLimit,
|
|
81
|
+
deadLetterExchange: topology.deadLetterExchange?.exchange,
|
|
82
|
+
});
|
|
93
83
|
await ch.bindQueue(queue.queue, topology.exchange, queue.routingKey);
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
try {
|
|
98
|
-
if (topology.retry && queue.retryQueues) {
|
|
99
|
-
await ch.assertQueue(queue.retryQueues.short, {
|
|
100
|
-
durable: true,
|
|
101
|
-
arguments: {
|
|
102
|
-
"x-message-ttl": topology.retry.policy_short_ms,
|
|
103
|
-
"x-dead-letter-exchange": topology.exchange,
|
|
104
|
-
},
|
|
105
|
-
});
|
|
106
|
-
await ch.assertQueue(queue.retryQueues.long, {
|
|
107
|
-
durable: true,
|
|
108
|
-
arguments: {
|
|
109
|
-
"x-message-ttl": topology.retry.policy_long_ms,
|
|
110
|
-
"x-dead-letter-exchange": topology.exchange,
|
|
111
|
-
},
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
catch (e) {
|
|
116
|
-
const msg = String(e?.message ?? e ?? "");
|
|
117
|
-
if (/PRECONDITION[_-]FAILED|inequivalent arg/i.test(msg)) {
|
|
118
|
-
// Sinaliza claramente drift de topologia
|
|
119
|
-
throw new Error(`RabbitMQ topology drift: ${msg}. Filas de retry existentes para '${queue.queue}' com TTL/args diferentes dos configurados. Alinhe variáveis ou remova filas manualmente.`);
|
|
120
|
-
}
|
|
121
|
-
throw e;
|
|
122
|
-
}
|
|
123
|
-
if (topology.retry && queue.retryQueues) {
|
|
124
|
-
await ch.bindQueue(queue.retryQueues.short, topology.retry.exchanges.short, queue.routingKey);
|
|
125
|
-
await ch.bindQueue(queue.retryQueues.long, topology.retry.exchanges.long, queue.routingKey);
|
|
126
|
-
}
|
|
84
|
+
await this.bindDeadLetterQueue(ch, topology, queue);
|
|
85
|
+
await this.assertRetryQueues(ch, queue, topology, retryQueueType, quorumGroupSize);
|
|
127
86
|
this.logger.log(`[RabbitMQ] Topology Queue => queue ${queue.queue}` +
|
|
128
87
|
(queue.deadLetterQueue ? ` | DLQ: ${queue.deadLetterQueue.name}` : "") +
|
|
129
88
|
` | exchange: ${topology.exchange} | bind: ${queue.routingKey}`);
|
|
@@ -137,6 +96,88 @@ let RabbitMQTopologyService = RabbitMQTopologyService_1 = class RabbitMQTopology
|
|
|
137
96
|
catch { }
|
|
138
97
|
}
|
|
139
98
|
}
|
|
99
|
+
async assertPrimaryQueues(ch, queue, options) {
|
|
100
|
+
const { queueType, quorumGroupSize, deliveryLimit, deadLetterExchange } = options;
|
|
101
|
+
try {
|
|
102
|
+
if (queue.deadLetterQueue) {
|
|
103
|
+
const deadLetterArgs = this.buildQueueArguments(queueType, undefined, { quorumGroupSize });
|
|
104
|
+
await ch.assertQueue(queue.deadLetterQueue.name, {
|
|
105
|
+
durable: true,
|
|
106
|
+
arguments: deadLetterArgs,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
const mainQueueArgs = this.buildQueueArguments(queueType, {
|
|
110
|
+
...(deadLetterExchange ? { "x-dead-letter-exchange": deadLetterExchange } : {}),
|
|
111
|
+
...(queue.deadLetterQueue?.routingKey ? { "x-dead-letter-routing-key": queue.deadLetterQueue.routingKey } : {}),
|
|
112
|
+
}, { deliveryLimit, quorumGroupSize });
|
|
113
|
+
await ch.assertQueue(queue.queue, {
|
|
114
|
+
durable: true,
|
|
115
|
+
arguments: mainQueueArgs,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (e) {
|
|
119
|
+
const msg = String(e?.message ?? e ?? "");
|
|
120
|
+
if (/PRECONDITION[_-]FAILED|inequivalent arg/i.test(msg)) {
|
|
121
|
+
throw new Error(`RabbitMQ topology drift: ${msg}. Fila '${queue.queue}' possui argumentos incompatíveis com a configuração atual. Remova a fila manualmente ou ajuste variáveis.`);
|
|
122
|
+
}
|
|
123
|
+
throw e;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async bindDeadLetterQueue(ch, topology, queue) {
|
|
127
|
+
if (!topology.deadLetterExchange || !queue.deadLetterQueue) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
await ch.bindQueue(queue.deadLetterQueue.name, topology.deadLetterExchange.exchange, queue.deadLetterQueue.routingKey);
|
|
131
|
+
}
|
|
132
|
+
async assertRetryQueues(ch, queue, topology, queueType, quorumGroupSize) {
|
|
133
|
+
if (!topology.retry || !queue.retryQueues) {
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
try {
|
|
137
|
+
const shortRetryArgs = this.buildQueueArguments(queueType, {
|
|
138
|
+
"x-message-ttl": topology.retry.policy_short_ms,
|
|
139
|
+
"x-dead-letter-exchange": topology.exchange,
|
|
140
|
+
}, { quorumGroupSize });
|
|
141
|
+
await ch.assertQueue(queue.retryQueues.short, {
|
|
142
|
+
durable: true,
|
|
143
|
+
arguments: shortRetryArgs,
|
|
144
|
+
});
|
|
145
|
+
const longRetryArgs = this.buildQueueArguments(queueType, {
|
|
146
|
+
"x-message-ttl": topology.retry.policy_long_ms,
|
|
147
|
+
"x-dead-letter-exchange": topology.exchange,
|
|
148
|
+
}, { quorumGroupSize });
|
|
149
|
+
await ch.assertQueue(queue.retryQueues.long, {
|
|
150
|
+
durable: true,
|
|
151
|
+
arguments: longRetryArgs,
|
|
152
|
+
});
|
|
153
|
+
await ch.bindQueue(queue.retryQueues.short, topology.retry.exchanges.short, queue.routingKey);
|
|
154
|
+
await ch.bindQueue(queue.retryQueues.long, topology.retry.exchanges.long, queue.routingKey);
|
|
155
|
+
}
|
|
156
|
+
catch (e) {
|
|
157
|
+
const msg = String(e?.message ?? e ?? "");
|
|
158
|
+
if (/PRECONDITION[_-]FAILED|inequivalent arg/i.test(msg)) {
|
|
159
|
+
throw new Error(`RabbitMQ topology drift: ${msg}. Filas de retry existentes para '${queue.queue}' com TTL/args diferentes dos configurados. Alinhe variáveis ou remova filas manualmente.`);
|
|
160
|
+
}
|
|
161
|
+
throw e;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
buildQueueArguments(queueType, extra, tuning) {
|
|
165
|
+
const args = {
|
|
166
|
+
"x-queue-type": queueType,
|
|
167
|
+
};
|
|
168
|
+
if (extra) {
|
|
169
|
+
Object.assign(args, extra);
|
|
170
|
+
}
|
|
171
|
+
if (queueType === "quorum") {
|
|
172
|
+
if (tuning?.deliveryLimit && tuning.deliveryLimit > 0) {
|
|
173
|
+
args["x-delivery-limit"] = tuning.deliveryLimit;
|
|
174
|
+
}
|
|
175
|
+
if (tuning?.quorumGroupSize && tuning.quorumGroupSize > 0) {
|
|
176
|
+
args["quorum-initial-group-size"] = tuning.quorumGroupSize;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return args;
|
|
180
|
+
}
|
|
140
181
|
};
|
|
141
182
|
RabbitMQTopologyService = RabbitMQTopologyService_1 = __decorate([
|
|
142
183
|
Injectable()
|
|
@@ -152,4 +193,10 @@ function toInt(v, def) {
|
|
|
152
193
|
const n = Number(v);
|
|
153
194
|
return Number.isFinite(n) && n > 0 ? Math.floor(n) : def;
|
|
154
195
|
}
|
|
196
|
+
function resolveQueueType(value, fallback = "quorum") {
|
|
197
|
+
if (!value) {
|
|
198
|
+
return fallback;
|
|
199
|
+
}
|
|
200
|
+
return value.toLowerCase() === "classic" ? "classic" : "quorum";
|
|
201
|
+
}
|
|
155
202
|
//# sourceMappingURL=rabbitmq-topology.service.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rabbitmq-topology.service.js","sourceRoot":"","sources":["../src/rabbitmq-topology.service.ts"],"names":[],"mappings":";;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"rabbitmq-topology.service.js","sourceRoot":"","sources":["../src/rabbitmq-topology.service.ts"],"names":[],"mappings":"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"}
|