@rsdk/nats.transport 5.8.0-next.4 → 5.8.0-next.6

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.
@@ -3,3 +3,4 @@ export declare const NATS_JETSTREAM_PROTOCOL = "nats-jetstream";
3
3
  * @deprecated use NATS_JETSTREAM_PROTOCOL instead
4
4
  */
5
5
  export declare const NATS_PROTOCOL = "nats-jetstream";
6
+ export declare const DEFAULT_MAX_ACK_PENDING = 1000;
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.NATS_PROTOCOL = exports.NATS_JETSTREAM_PROTOCOL = void 0;
3
+ exports.DEFAULT_MAX_ACK_PENDING = exports.NATS_PROTOCOL = exports.NATS_JETSTREAM_PROTOCOL = void 0;
4
4
  exports.NATS_JETSTREAM_PROTOCOL = 'nats-jetstream';
5
5
  /**
6
6
  * @deprecated use NATS_JETSTREAM_PROTOCOL instead
7
7
  */
8
8
  exports.NATS_PROTOCOL = exports.NATS_JETSTREAM_PROTOCOL;
9
+ exports.DEFAULT_MAX_ACK_PENDING = 1000;
9
10
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/jetstream/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,uBAAuB,GAAG,gBAAgB,CAAC;AAExD;;GAEG;AACU,QAAA,aAAa,GAAG,+BAAuB,CAAC"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/jetstream/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,uBAAuB,GAAG,gBAAgB,CAAC;AAExD;;GAEG;AACU,QAAA,aAAa,GAAG,+BAAuB,CAAC;AAExC,QAAA,uBAAuB,GAAG,IAAI,CAAC"}
@@ -14,7 +14,6 @@ export declare class NatsJetStreamServer extends Server implements CustomTranspo
14
14
  logger: import("@rsdk/logging").ILogger;
15
15
  readonly deserializer: EventsDeserializer<EventTypeWithOptions>;
16
16
  private nc?;
17
- private jsm?;
18
17
  private readonly streams;
19
18
  private readonly normalizedApplicationName;
20
19
  private readonly autoUpdateConsumers;
@@ -58,20 +57,20 @@ export declare class NatsJetStreamServer extends Server implements CustomTranspo
58
57
  */
59
58
  private bindEventHandlers;
60
59
  /**
61
- * Группирует обработчики по типу порядка (зависимые и независимые от порядка).
60
+ * Группирует обработчики в консьюмеры.
62
61
  *
63
62
  * @param {Array<[string, MessageHandler<any, any, any>]>} eventHandlers - Список обработчиков событий,
64
63
  * где каждый элемент представляет собой кортеж из метаданных и обработчика.
65
64
  *
66
- * @returns {{
67
- * orderedConsumers: ConsumersMap,
68
- * unorderedConsumers: ConsumersMap
69
- * }}
70
- * Объект, содержащий две карты:
71
- * - orderedConsumers: карта с зависимыми от порядка consumer'ами.
72
- * - unorderedConsumers: карта с независимыми от порядка consumer'ами.
65
+ * @returns ConsumersMap
73
66
  */
74
- private groupHandlersByOrderType;
67
+ private groupHandlersByConsumers;
68
+ private getStreamsAndOldConsumers;
69
+ private hasSubjectConflict;
70
+ private resolveConsumerConflicts;
71
+ private resolveConsumerConflictsWithPause;
72
+ private resolveConsumerConflictsWithoutPause;
73
+ private getUpdatedMinSeqs;
75
74
  /**
76
75
  * Получает информацию о консьюмере.
77
76
  * @param js - Клиент JetStream.
@@ -128,4 +127,5 @@ export declare class NatsJetStreamServer extends Server implements CustomTranspo
128
127
  * @returns Часть типа.
129
128
  */
130
129
  private getTypePart;
130
+ private isNatsVersionAtLeast;
131
131
  }
@@ -12,6 +12,7 @@ const lodash_1 = require("lodash");
12
12
  const nats_1 = require("nats");
13
13
  const rxjs_1 = require("rxjs");
14
14
  const events_deserializer_1 = require("../events.deserializer");
15
+ const constants_1 = require("./constants");
15
16
  /**
16
17
  * Класс, реализующий сервер NATS JetStream.
17
18
  */
@@ -22,7 +23,6 @@ class NatsJetStreamServer extends microservices_1.Server {
22
23
  logger = logging_1.LoggerFactory.create(NatsJetStreamServer.name);
23
24
  deserializer = new events_deserializer_1.EventsDeserializer();
24
25
  nc;
25
- jsm;
26
26
  streams = new Set();
27
27
  normalizedApplicationName;
28
28
  autoUpdateConsumers;
@@ -51,7 +51,6 @@ class NatsJetStreamServer extends microservices_1.Server {
51
51
  this.nc = await (0, nats_1.connect)(this.options.connectionOptions);
52
52
  this.options.connectionOptions.connectedHook?.(this.nc);
53
53
  }
54
- this.jsm = await this.nc.jetstreamManager(this.options.jetStreamOptions);
55
54
  await this.bindEventHandlers();
56
55
  callback();
57
56
  }
@@ -117,51 +116,165 @@ class NatsJetStreamServer extends microservices_1.Server {
117
116
  throw new core_1.InternalException('Connection must be established');
118
117
  }
119
118
  const js = this.nc.jetstream(this.options.jetStreamOptions);
120
- const { orderedConsumers, unorderedConsumers } = this.groupHandlersByOrderType(eventHandlers);
121
- for (const [consumerName, consumer] of orderedConsumers) {
122
- await this.createConsumer(js, `${consumerName}-ordered`, consumer, {
123
- max_ack_pending: 1,
124
- });
119
+ const jsm = await js.jetstreamManager();
120
+ const relevantConsumers = this.groupHandlersByConsumers(eventHandlers);
121
+ const relevantConsumerNames = new Set(relevantConsumers.keys());
122
+ const expectedSubjectsByConsumer = new Map();
123
+ const { streamsMap, oldConsumersByStreamMap } = await this.getStreamsAndOldConsumers(jsm);
124
+ /**
125
+ * Первая попытка создать без конфликта
126
+ */
127
+ for (const [relevantConsumerName, relevantConsumer] of relevantConsumers) {
128
+ const expectedSubjects = [
129
+ ...relevantConsumer.mapping.values(),
130
+ ].flatMap((e) => this.getEventSubjects(e.deserializer));
131
+ expectedSubjectsByConsumer.set(relevantConsumerName, expectedSubjects);
132
+ const oldConsumers = oldConsumersByStreamMap.get(relevantConsumer.streamName);
133
+ const conflictOldConsumer = [...oldConsumers.values()].find((oldConsumer) => this.hasSubjectConflict(oldConsumer, expectedSubjects));
134
+ const sameNameOldConsumer = oldConsumers.get(relevantConsumerName);
135
+ const canCreateDirectly = !conflictOldConsumer ||
136
+ (sameNameOldConsumer &&
137
+ expectedSubjects.every((subject) => sameNameOldConsumer.config.filter_subjects?.includes(subject)));
138
+ /**
139
+ * Создаем, если нужных subject'ов нет в других консьюмерах,
140
+ * либо все нужные subject'ы присутствуют в консьюмере с актуальным названием
141
+ */
142
+ if (canCreateDirectly) {
143
+ this.logger.trace(`Create consumer without conflict`, {
144
+ consumerName: relevantConsumerName,
145
+ });
146
+ await this.createConsumer(js, relevantConsumerName, relevantConsumer, {
147
+ filter_subjects: expectedSubjects,
148
+ });
149
+ relevantConsumers.delete(relevantConsumerName);
150
+ }
125
151
  }
126
- for (const [consumerName, consumer] of unorderedConsumers) {
127
- await this.createConsumer(js, consumerName, consumer, {});
152
+ /**
153
+ * Решение конфликтов
154
+ */
155
+ for (const [consumerName, consumer] of relevantConsumers) {
156
+ const oldConsumers = oldConsumersByStreamMap.get(consumer.streamName);
157
+ const expectedSubjects = expectedSubjectsByConsumer.get(consumerName);
158
+ const { lowestLastAckSeq, lowestStartSeq } = await this.resolveConsumerConflicts(jsm, expectedSubjects, consumer, relevantConsumerNames, oldConsumers);
159
+ const isWorkQueue = streamsMap.get(consumer.streamName)?.config.retention ===
160
+ nats_1.RetentionPolicy.Workqueue;
161
+ const options = isWorkQueue || (!lowestLastAckSeq && !lowestStartSeq)
162
+ ? {
163
+ deliver_policy: nats_1.DeliverPolicy.All,
164
+ }
165
+ : {
166
+ opt_start_seq: Math.max(lowestLastAckSeq + 1, lowestStartSeq ?? 0),
167
+ deliver_policy: nats_1.DeliverPolicy.StartSequence,
168
+ };
169
+ this.logger.trace(`Create consumer after conflicts resolving`, {
170
+ consumerName,
171
+ });
172
+ await this.createConsumer(js, consumerName, consumer, {
173
+ filter_subjects: expectedSubjects,
174
+ ...options,
175
+ });
128
176
  }
129
177
  }
130
178
  /**
131
- * Группирует обработчики по типу порядка (зависимые и независимые от порядка).
179
+ * Группирует обработчики в консьюмеры.
132
180
  *
133
181
  * @param {Array<[string, MessageHandler<any, any, any>]>} eventHandlers - Список обработчиков событий,
134
182
  * где каждый элемент представляет собой кортеж из метаданных и обработчика.
135
183
  *
136
- * @returns {{
137
- * orderedConsumers: ConsumersMap,
138
- * unorderedConsumers: ConsumersMap
139
- * }}
140
- * Объект, содержащий две карты:
141
- * - orderedConsumers: карта с зависимыми от порядка consumer'ами.
142
- * - unorderedConsumers: карта с независимыми от порядка consumer'ами.
184
+ * @returns ConsumersMap
143
185
  */
144
- groupHandlersByOrderType(eventHandlers) {
145
- const orderedConsumers = new Map();
146
- const unorderedConsumers = new Map();
186
+ groupHandlersByConsumers(eventHandlers) {
187
+ const consumers = new Map();
147
188
  for (const [meta, handler] of eventHandlers) {
148
189
  const deserializer = this.deserializer.events.get(meta);
149
190
  const consumerName = this.getConsumerName(deserializer);
150
191
  const streamName = this.getStreamName(deserializer);
151
- const targetMap = deserializer.options?.maxAckPending
152
- ? orderedConsumers
153
- : unorderedConsumers;
154
- const aggregatedConsumer = targetMap.get(consumerName) ?? {
192
+ const aggregatedConsumer = consumers.get(consumerName) ?? {
155
193
  streamName,
156
194
  mapping: new Map(),
195
+ maxAckPending: deserializer.options?.maxAckPending ?? constants_1.DEFAULT_MAX_ACK_PENDING,
157
196
  };
158
197
  aggregatedConsumer.mapping.set(this.getTypePart(deserializer.type), {
159
198
  deserializer,
160
199
  handler,
161
200
  });
162
- targetMap.set(consumerName, aggregatedConsumer);
201
+ consumers.set(consumerName, aggregatedConsumer);
202
+ }
203
+ return consumers;
204
+ }
205
+ async getStreamsAndOldConsumers(jsm) {
206
+ const streamsMap = new Map();
207
+ const oldConsumersByStreamMap = new Map();
208
+ await Promise.all(Array.from(this.streams.values()).map(async (streamName) => {
209
+ oldConsumersByStreamMap.set(streamName, new Map());
210
+ const oldConsumers = oldConsumersByStreamMap.get(streamName);
211
+ streamsMap.set(streamName, await jsm.streams.info(streamName));
212
+ for await (const consumer of jsm.consumers.list(streamName)) {
213
+ if (consumer.config.durable_name?.includes(this.normalizedApplicationName)) {
214
+ oldConsumers.set(consumer.config.durable_name, consumer);
215
+ }
216
+ }
217
+ }));
218
+ return { streamsMap, oldConsumersByStreamMap };
219
+ }
220
+ hasSubjectConflict(consumer, expectedSubjects) {
221
+ const filterSubjects = consumer.config.filter_subjects;
222
+ const filterSubject = consumer.config.filter_subject;
223
+ return !!((!filterSubjects && !filterSubject) ||
224
+ (filterSubjects &&
225
+ filterSubjects.some((s) => expectedSubjects.includes(s))) ||
226
+ (filterSubject && expectedSubjects.includes(filterSubject)));
227
+ }
228
+ async resolveConsumerConflicts(jsm, expectedSubjects, consumer, relevantConsumerNames, oldConsumers) {
229
+ const conflictOldConsumers = [...oldConsumers.values()].filter((oldConsumer) => this.hasSubjectConflict(oldConsumer, expectedSubjects));
230
+ /**
231
+ * NOTE: пауза позволяет дождаться все pending ack'и и избежать race condition.
232
+ * Но пауза появилась только в nats-server версии 2.11.0.
233
+ */
234
+ return this.isNatsVersionAtLeast(this.nc.info.version, 2, 11, 0)
235
+ ? this.resolveConsumerConflictsWithPause(jsm, consumer, conflictOldConsumers, relevantConsumerNames)
236
+ : this.resolveConsumerConflictsWithoutPause(jsm, consumer, conflictOldConsumers, relevantConsumerNames);
237
+ }
238
+ async resolveConsumerConflictsWithPause(jsm, relevantConsumer, conflictOldConsumers, relevantConsumerNames) {
239
+ let lowestLastAckSeq = Infinity;
240
+ let lowestStartSeq = undefined;
241
+ for (const oldConsumer of conflictOldConsumers) {
242
+ const conflictDurableName = oldConsumer.config.durable_name;
243
+ this.logger.trace(`Pause conflict consumer`, { conflictDurableName });
244
+ await jsm.consumers.pause(relevantConsumer.streamName, conflictDurableName, new Date(Date.now() + 60000));
245
+ const oldConsumerInfoAfterPause = await jsm.consumers.info(relevantConsumer.streamName, conflictDurableName);
246
+ ({ lowestLastAckSeq, lowestStartSeq } = this.getUpdatedMinSeqs(oldConsumerInfoAfterPause, lowestLastAckSeq, lowestStartSeq));
247
+ if (relevantConsumerNames.has(conflictDurableName)) {
248
+ this.logger.trace(`Resume conflict consumer`, { conflictDurableName });
249
+ jsm.consumers.resume(relevantConsumer.streamName, conflictDurableName);
250
+ }
251
+ else {
252
+ this.logger.trace(`Delete conflict consumer`, { conflictDurableName });
253
+ jsm.consumers.delete(relevantConsumer.streamName, conflictDurableName);
254
+ }
255
+ }
256
+ return { lowestLastAckSeq, lowestStartSeq };
257
+ }
258
+ async resolveConsumerConflictsWithoutPause(jsm, relevantConsumer, conflictOldConsumers, relevantConsumerNames) {
259
+ let lowestLastAckSeq = Infinity;
260
+ let lowestStartSeq = undefined;
261
+ for (const oldConsumer of conflictOldConsumers) {
262
+ const conflictDurableName = oldConsumer.config.durable_name;
263
+ ({ lowestLastAckSeq, lowestStartSeq } = this.getUpdatedMinSeqs(oldConsumer, lowestLastAckSeq, lowestStartSeq));
264
+ if (!relevantConsumerNames.has(conflictDurableName)) {
265
+ this.logger.trace(`Delete conflict consumer`, { conflictDurableName });
266
+ await jsm.consumers.delete(relevantConsumer.streamName, conflictDurableName);
267
+ }
163
268
  }
164
- return { orderedConsumers, unorderedConsumers };
269
+ return { lowestLastAckSeq, lowestStartSeq };
270
+ }
271
+ getUpdatedMinSeqs(oldConsumer, lowestLastAckSeq, lowestStartSeq) {
272
+ lowestLastAckSeq = Math.min(lowestLastAckSeq, oldConsumer.ack_floor.stream_seq);
273
+ const startSeq = oldConsumer.config.opt_start_seq;
274
+ if (startSeq !== undefined) {
275
+ lowestStartSeq = Math.min(lowestStartSeq ?? Infinity, startSeq);
276
+ }
277
+ return { lowestLastAckSeq, lowestStartSeq };
165
278
  }
166
279
  /**
167
280
  * Получает информацию о консьюмере.
@@ -180,7 +293,7 @@ class NatsJetStreamServer extends microservices_1.Server {
180
293
  * @param consumer - Информация о консьюмере.
181
294
  * @param options - Дополнительные параметры конфигурации консьюмера.
182
295
  */
183
- async createConsumer(js, consumerName, { streamName, mapping }, options) {
296
+ async createConsumer(js, consumerName, { streamName, mapping, maxAckPending }, options) {
184
297
  try {
185
298
  await js.streams.get(streamName);
186
299
  this.logger.trace('Stream %s found', { streamName });
@@ -192,20 +305,19 @@ class NatsJetStreamServer extends microservices_1.Server {
192
305
  });
193
306
  }
194
307
  const jsm = await js.jetstreamManager();
195
- const expectedSubjects = [...mapping.values()].flatMap((e) => this.getEventSubjects(e.deserializer));
196
308
  const ackPolicy = [...mapping.values()][0].deserializer.options?.ackPolicy;
197
309
  const consumer = (await this.getConsumer(js, streamName, consumerName).catch(() => null)) ??
198
310
  (await jsm.consumers
199
311
  .add(streamName, (0, common_1.omitUndefined)({
200
312
  ...options,
313
+ max_ack_pending: maxAckPending,
201
314
  ack_policy: ackPolicy,
202
315
  durable_name: consumerName,
203
- filter_subjects: expectedSubjects,
204
316
  }))
205
317
  .then(() => this.getConsumer(js, streamName, consumerName)));
206
318
  const info = await consumer.info();
207
319
  const receivedSubjects = info.config.filter_subjects;
208
- await this.handleCorrectness(jsm, streamName, consumerName, expectedSubjects, receivedSubjects);
320
+ await this.handleCorrectness(jsm, streamName, consumerName, options.filter_subjects, receivedSubjects);
209
321
  this.handleEventMessages(consumer, mapping, consumerName);
210
322
  }
211
323
  /**
@@ -291,14 +403,14 @@ class NatsJetStreamServer extends microservices_1.Server {
291
403
  * @returns Имя консьюмера.
292
404
  */
293
405
  getConsumerName(contract) {
294
- const arr = [
295
- this.normalizedApplicationName,
296
- this.getStreamName(contract),
297
- 'consumer',
298
- ];
406
+ const arr = [];
299
407
  if (contract.options?.consumerName) {
300
- arr.unshift(contract.options.consumerName);
408
+ arr.push(contract.options.consumerName);
301
409
  }
410
+ const maxAckPending = `${contract.options?.maxAckPending === -1
411
+ ? 'infinite'
412
+ : (contract.options?.maxAckPending ?? constants_1.DEFAULT_MAX_ACK_PENDING)}`;
413
+ arr.push(this.normalizedApplicationName, this.getStreamName(contract), 'maxAckPending', maxAckPending, 'ackPolicy', contract.options?.ackPolicy ?? nats_1.AckPolicy.None);
302
414
  return arr.join('-');
303
415
  }
304
416
  /**
@@ -307,7 +419,9 @@ class NatsJetStreamServer extends microservices_1.Server {
307
419
  * @returns Темы событий.
308
420
  */
309
421
  getEventSubjects(contract) {
310
- return contract.options?.subjects ?? [];
422
+ return (contract.options?.subjects ?? [
423
+ (0, nats_common_1.getSubjectName)(contract.type, contract.options?.partition),
424
+ ]);
311
425
  }
312
426
  /**
313
427
  * Получает часть типа события.
@@ -317,6 +431,14 @@ class NatsJetStreamServer extends microservices_1.Server {
317
431
  getTypePart(eventType) {
318
432
  return (typeof eventType === 'string' ? eventType : eventType.$type).replaceAll('.', '-');
319
433
  }
434
+ isNatsVersionAtLeast(version, minMajor, minMinor, minPatch) {
435
+ const [major, minor, patch] = version.split('-')[0].split('.').map(Number);
436
+ if (major !== minMajor)
437
+ return major > minMajor;
438
+ if (minor !== minMinor)
439
+ return minor > minMinor;
440
+ return patch >= minPatch;
441
+ }
320
442
  }
321
443
  exports.NatsJetStreamServer = NatsJetStreamServer;
322
444
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/jetstream/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/jetstream/server.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,5 @@ export type ConsumeOptions = {
5
5
  maxAckPending?: number;
6
6
  consumerName?: string;
7
7
  ackPolicy?: AckPolicy;
8
+ partition?: string;
8
9
  };
@@ -2,4 +2,5 @@ import type { Mapping } from './mapping.type';
2
2
  export type ConsumerInfo = {
3
3
  streamName: string;
4
4
  mapping: Mapping;
5
+ maxAckPending: number;
5
6
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rsdk/nats.transport",
3
- "version": "5.8.0-next.4",
3
+ "version": "5.8.0-next.6",
4
4
  "description": "Nats NestJS Transport",
5
5
  "main": "dist/index.js",
6
6
  "license": "Apache License 2.0",
@@ -37,5 +37,5 @@
37
37
  "rxjs": "^7.1.0"
38
38
  },
39
39
  "nx": {},
40
- "gitHead": "22b0461b366828fb376eb6a83d6194003822d7cd"
40
+ "gitHead": "317e239c10a0601b489b6a1347f8de88a730e8d8"
41
41
  }
@@ -4,3 +4,5 @@ export const NATS_JETSTREAM_PROTOCOL = 'nats-jetstream';
4
4
  * @deprecated use NATS_JETSTREAM_PROTOCOL instead
5
5
  */
6
6
  export const NATS_PROTOCOL = NATS_JETSTREAM_PROTOCOL;
7
+
8
+ export const DEFAULT_MAX_ACK_PENDING = 1000;
@@ -14,20 +14,27 @@ import { InternalException, NotFoundException } from '@rsdk/core';
14
14
  import type { EventType } from '@rsdk/events.common';
15
15
  import { isEventType, X_TYPE_HEADER } from '@rsdk/events.common';
16
16
  import { LoggerFactory } from '@rsdk/logging';
17
- import { getStreamName, isMessageType } from '@rsdk/nats.common';
17
+ import {
18
+ getStreamName,
19
+ getSubjectName,
20
+ isMessageType,
21
+ } from '@rsdk/nats.common';
18
22
  import { isEqual } from 'lodash';
19
23
  import type {
20
24
  Consumer,
21
25
  ConsumerConfig,
26
+ ConsumerInfo as NativeConsumerInfo,
22
27
  JetStreamClient,
23
28
  JetStreamManager,
24
29
  NatsConnection,
30
+ StreamInfo,
25
31
  } from 'nats';
26
- import { connect } from 'nats';
32
+ import { AckPolicy, connect, DeliverPolicy, RetentionPolicy } from 'nats';
27
33
  import { connectable, isObservable, Subject } from 'rxjs';
28
34
 
29
35
  import { EventsDeserializer } from '../events.deserializer';
30
36
 
37
+ import { DEFAULT_MAX_ACK_PENDING } from './constants';
31
38
  import type {
32
39
  ConsumerInfo,
33
40
  ConsumersMap,
@@ -48,7 +55,6 @@ export class NatsJetStreamServer
48
55
  new EventsDeserializer<EventTypeWithOptions>();
49
56
 
50
57
  private nc?: NatsConnection;
51
- private jsm?: JetStreamManager;
52
58
  private readonly streams = new Set<string>();
53
59
 
54
60
  private readonly normalizedApplicationName: string;
@@ -89,7 +95,6 @@ export class NatsJetStreamServer
89
95
  this.nc = await connect(this.options.connectionOptions);
90
96
  this.options.connectionOptions!.connectedHook?.(this.nc);
91
97
  }
92
- this.jsm = await this.nc.jetstreamManager(this.options.jetStreamOptions);
93
98
 
94
99
  await this.bindEventHandlers();
95
100
  callback();
@@ -181,64 +186,303 @@ export class NatsJetStreamServer
181
186
  if (!this.nc) {
182
187
  throw new InternalException('Connection must be established');
183
188
  }
189
+
184
190
  const js = this.nc.jetstream(this.options.jetStreamOptions);
191
+ const jsm = await js.jetstreamManager();
192
+ const relevantConsumers = this.groupHandlersByConsumers(eventHandlers);
193
+ const relevantConsumerNames = new Set<string>(relevantConsumers.keys());
194
+ const expectedSubjectsByConsumer = new Map<string, string[]>();
185
195
 
186
- const { orderedConsumers, unorderedConsumers } =
187
- this.groupHandlersByOrderType(eventHandlers);
196
+ const { streamsMap, oldConsumersByStreamMap } =
197
+ await this.getStreamsAndOldConsumers(jsm);
188
198
 
189
- for (const [consumerName, consumer] of orderedConsumers) {
190
- await this.createConsumer(js, `${consumerName}-ordered`, consumer, {
191
- max_ack_pending: 1,
192
- });
199
+ /**
200
+ * Первая попытка создать без конфликта
201
+ */
202
+ for (const [relevantConsumerName, relevantConsumer] of relevantConsumers) {
203
+ const expectedSubjects: string[] = [
204
+ ...relevantConsumer.mapping.values(),
205
+ ].flatMap((e) => this.getEventSubjects(e.deserializer));
206
+
207
+ expectedSubjectsByConsumer.set(relevantConsumerName, expectedSubjects);
208
+
209
+ const oldConsumers = oldConsumersByStreamMap.get(
210
+ relevantConsumer.streamName,
211
+ )!;
212
+
213
+ const conflictOldConsumer = [...oldConsumers.values()].find(
214
+ (oldConsumer) => this.hasSubjectConflict(oldConsumer, expectedSubjects),
215
+ );
216
+
217
+ const sameNameOldConsumer = oldConsumers.get(relevantConsumerName);
218
+ const canCreateDirectly =
219
+ !conflictOldConsumer ||
220
+ (sameNameOldConsumer &&
221
+ expectedSubjects.every((subject) =>
222
+ sameNameOldConsumer.config.filter_subjects?.includes(subject),
223
+ ));
224
+
225
+ /**
226
+ * Создаем, если нужных subject'ов нет в других консьюмерах,
227
+ * либо все нужные subject'ы присутствуют в консьюмере с актуальным названием
228
+ */
229
+ if (canCreateDirectly) {
230
+ this.logger.trace(`Create consumer without conflict`, {
231
+ consumerName: relevantConsumerName,
232
+ });
233
+
234
+ await this.createConsumer(js, relevantConsumerName, relevantConsumer, {
235
+ filter_subjects: expectedSubjects,
236
+ });
237
+ relevantConsumers.delete(relevantConsumerName);
238
+ }
193
239
  }
194
240
 
195
- for (const [consumerName, consumer] of unorderedConsumers) {
196
- await this.createConsumer(js, consumerName, consumer, {});
241
+ /**
242
+ * Решение конфликтов
243
+ */
244
+ for (const [consumerName, consumer] of relevantConsumers) {
245
+ const oldConsumers = oldConsumersByStreamMap.get(consumer.streamName)!;
246
+ const expectedSubjects = expectedSubjectsByConsumer.get(consumerName)!;
247
+
248
+ const { lowestLastAckSeq, lowestStartSeq } =
249
+ await this.resolveConsumerConflicts(
250
+ jsm,
251
+ expectedSubjects,
252
+ consumer,
253
+ relevantConsumerNames,
254
+ oldConsumers,
255
+ );
256
+
257
+ const isWorkQueue =
258
+ streamsMap.get(consumer.streamName)?.config.retention ===
259
+ RetentionPolicy.Workqueue;
260
+
261
+ const options =
262
+ isWorkQueue || (!lowestLastAckSeq && !lowestStartSeq)
263
+ ? {
264
+ deliver_policy: DeliverPolicy.All,
265
+ }
266
+ : {
267
+ opt_start_seq: Math.max(
268
+ lowestLastAckSeq + 1,
269
+ lowestStartSeq ?? 0,
270
+ ),
271
+ deliver_policy: DeliverPolicy.StartSequence,
272
+ };
273
+
274
+ this.logger.trace(`Create consumer after conflicts resolving`, {
275
+ consumerName,
276
+ });
277
+
278
+ await this.createConsumer(js, consumerName, consumer, {
279
+ filter_subjects: expectedSubjects,
280
+ ...options,
281
+ });
197
282
  }
198
283
  }
199
284
 
200
285
  /**
201
- * Группирует обработчики по типу порядка (зависимые и независимые от порядка).
286
+ * Группирует обработчики в консьюмеры.
202
287
  *
203
288
  * @param {Array<[string, MessageHandler<any, any, any>]>} eventHandlers - Список обработчиков событий,
204
289
  * где каждый элемент представляет собой кортеж из метаданных и обработчика.
205
290
  *
206
- * @returns {{
207
- * orderedConsumers: ConsumersMap,
208
- * unorderedConsumers: ConsumersMap
209
- * }}
210
- * Объект, содержащий две карты:
211
- * - orderedConsumers: карта с зависимыми от порядка consumer'ами.
212
- * - unorderedConsumers: карта с независимыми от порядка consumer'ами.
291
+ * @returns ConsumersMap
213
292
  */
214
- private groupHandlersByOrderType(
293
+ private groupHandlersByConsumers(
215
294
  eventHandlers: [string, MessageHandler<any, any, any>][],
216
- ): { orderedConsumers: ConsumersMap; unorderedConsumers: ConsumersMap } {
217
- const orderedConsumers: ConsumersMap = new Map();
218
- const unorderedConsumers: ConsumersMap = new Map();
295
+ ): ConsumersMap {
296
+ const consumers: ConsumersMap = new Map();
219
297
 
220
298
  for (const [meta, handler] of eventHandlers) {
221
299
  const deserializer = this.deserializer.events.get(meta)!;
222
300
  const consumerName = this.getConsumerName(deserializer);
223
301
  const streamName = this.getStreamName(deserializer);
224
302
 
225
- const targetMap = deserializer.options?.maxAckPending
226
- ? orderedConsumers
227
- : unorderedConsumers;
228
-
229
- const aggregatedConsumer = targetMap.get(consumerName) ?? {
303
+ const aggregatedConsumer = consumers.get(consumerName) ?? {
230
304
  streamName,
231
305
  mapping: new Map() as Mapping,
306
+ maxAckPending:
307
+ deserializer.options?.maxAckPending ?? DEFAULT_MAX_ACK_PENDING,
232
308
  };
233
309
 
234
310
  aggregatedConsumer.mapping.set(this.getTypePart(deserializer.type), {
235
311
  deserializer,
236
312
  handler,
237
313
  });
238
- targetMap.set(consumerName, aggregatedConsumer);
314
+ consumers.set(consumerName, aggregatedConsumer);
315
+ }
316
+
317
+ return consumers;
318
+ }
319
+
320
+ private async getStreamsAndOldConsumers(jsm: JetStreamManager): Promise<{
321
+ streamsMap: Map<string, StreamInfo>;
322
+ oldConsumersByStreamMap: Map<string, Map<string, NativeConsumerInfo>>;
323
+ }> {
324
+ const streamsMap = new Map<string, StreamInfo>();
325
+ const oldConsumersByStreamMap = new Map<
326
+ string,
327
+ Map<string, NativeConsumerInfo>
328
+ >();
329
+
330
+ await Promise.all(
331
+ Array.from(this.streams.values()).map(async (streamName) => {
332
+ oldConsumersByStreamMap.set(streamName, new Map());
333
+ const oldConsumers = oldConsumersByStreamMap.get(streamName)!;
334
+
335
+ streamsMap.set(streamName, await jsm.streams.info(streamName));
336
+
337
+ for await (const consumer of jsm.consumers.list(streamName)) {
338
+ if (
339
+ consumer.config.durable_name?.includes(
340
+ this.normalizedApplicationName,
341
+ )
342
+ ) {
343
+ oldConsumers.set(consumer.config.durable_name, consumer);
344
+ }
345
+ }
346
+ }),
347
+ );
348
+
349
+ return { streamsMap, oldConsumersByStreamMap };
350
+ }
351
+
352
+ private hasSubjectConflict(
353
+ consumer: NativeConsumerInfo,
354
+ expectedSubjects: string[],
355
+ ): boolean {
356
+ const filterSubjects = consumer.config.filter_subjects;
357
+ const filterSubject = consumer.config.filter_subject;
358
+
359
+ return !!(
360
+ (!filterSubjects && !filterSubject) ||
361
+ (filterSubjects &&
362
+ filterSubjects.some((s) => expectedSubjects.includes(s))) ||
363
+ (filterSubject && expectedSubjects.includes(filterSubject))
364
+ );
365
+ }
366
+
367
+ private async resolveConsumerConflicts(
368
+ jsm: JetStreamManager,
369
+ expectedSubjects: string[],
370
+ consumer: ConsumerInfo,
371
+ relevantConsumerNames: Set<string>,
372
+ oldConsumers: Map<string, NativeConsumerInfo>,
373
+ ): Promise<{ lowestLastAckSeq: number; lowestStartSeq: number | undefined }> {
374
+ const conflictOldConsumers = [...oldConsumers.values()].filter(
375
+ (oldConsumer) => this.hasSubjectConflict(oldConsumer, expectedSubjects),
376
+ );
377
+
378
+ /**
379
+ * NOTE: пауза позволяет дождаться все pending ack'и и избежать race condition.
380
+ * Но пауза появилась только в nats-server версии 2.11.0.
381
+ */
382
+ return this.isNatsVersionAtLeast(this.nc!.info!.version, 2, 11, 0)
383
+ ? this.resolveConsumerConflictsWithPause(
384
+ jsm,
385
+ consumer,
386
+ conflictOldConsumers,
387
+ relevantConsumerNames,
388
+ )
389
+ : this.resolveConsumerConflictsWithoutPause(
390
+ jsm,
391
+ consumer,
392
+ conflictOldConsumers,
393
+ relevantConsumerNames,
394
+ );
395
+ }
396
+
397
+ private async resolveConsumerConflictsWithPause(
398
+ jsm: JetStreamManager,
399
+ relevantConsumer: ConsumerInfo,
400
+ conflictOldConsumers: NativeConsumerInfo[],
401
+ relevantConsumerNames: Set<string>,
402
+ ): Promise<{ lowestLastAckSeq: number; lowestStartSeq: number | undefined }> {
403
+ let lowestLastAckSeq = Infinity;
404
+ let lowestStartSeq: number | undefined = undefined;
405
+
406
+ for (const oldConsumer of conflictOldConsumers) {
407
+ const conflictDurableName = oldConsumer.config.durable_name!;
408
+
409
+ this.logger.trace(`Pause conflict consumer`, { conflictDurableName });
410
+
411
+ await jsm.consumers.pause(
412
+ relevantConsumer.streamName,
413
+ conflictDurableName,
414
+ new Date(Date.now() + 60000),
415
+ );
416
+
417
+ const oldConsumerInfoAfterPause = await jsm.consumers.info(
418
+ relevantConsumer.streamName,
419
+ conflictDurableName,
420
+ );
421
+
422
+ ({ lowestLastAckSeq, lowestStartSeq } = this.getUpdatedMinSeqs(
423
+ oldConsumerInfoAfterPause,
424
+ lowestLastAckSeq,
425
+ lowestStartSeq,
426
+ ));
427
+
428
+ if (relevantConsumerNames.has(conflictDurableName)) {
429
+ this.logger.trace(`Resume conflict consumer`, { conflictDurableName });
430
+ jsm.consumers.resume(relevantConsumer.streamName, conflictDurableName);
431
+ } else {
432
+ this.logger.trace(`Delete conflict consumer`, { conflictDurableName });
433
+ jsm.consumers.delete(relevantConsumer.streamName, conflictDurableName);
434
+ }
435
+ }
436
+
437
+ return { lowestLastAckSeq, lowestStartSeq };
438
+ }
439
+
440
+ private async resolveConsumerConflictsWithoutPause(
441
+ jsm: JetStreamManager,
442
+ relevantConsumer: ConsumerInfo,
443
+ conflictOldConsumers: NativeConsumerInfo[],
444
+ relevantConsumerNames: Set<string>,
445
+ ): Promise<{ lowestLastAckSeq: number; lowestStartSeq: number | undefined }> {
446
+ let lowestLastAckSeq = Infinity;
447
+ let lowestStartSeq: number | undefined = undefined;
448
+
449
+ for (const oldConsumer of conflictOldConsumers) {
450
+ const conflictDurableName = oldConsumer.config.durable_name!;
451
+
452
+ ({ lowestLastAckSeq, lowestStartSeq } = this.getUpdatedMinSeqs(
453
+ oldConsumer,
454
+ lowestLastAckSeq,
455
+ lowestStartSeq,
456
+ ));
457
+
458
+ if (!relevantConsumerNames.has(conflictDurableName)) {
459
+ this.logger.trace(`Delete conflict consumer`, { conflictDurableName });
460
+ await jsm.consumers.delete(
461
+ relevantConsumer.streamName,
462
+ conflictDurableName,
463
+ );
464
+ }
465
+ }
466
+
467
+ return { lowestLastAckSeq, lowestStartSeq };
468
+ }
469
+
470
+ private getUpdatedMinSeqs(
471
+ oldConsumer: NativeConsumerInfo,
472
+ lowestLastAckSeq: number,
473
+ lowestStartSeq: number | undefined,
474
+ ): { lowestLastAckSeq: number; lowestStartSeq: number | undefined } {
475
+ lowestLastAckSeq = Math.min(
476
+ lowestLastAckSeq,
477
+ oldConsumer.ack_floor.stream_seq,
478
+ );
479
+
480
+ const startSeq = oldConsumer.config.opt_start_seq;
481
+ if (startSeq !== undefined) {
482
+ lowestStartSeq = Math.min(lowestStartSeq ?? Infinity, startSeq);
239
483
  }
240
484
 
241
- return { orderedConsumers, unorderedConsumers };
485
+ return { lowestLastAckSeq, lowestStartSeq };
242
486
  }
243
487
 
244
488
  /**
@@ -266,8 +510,8 @@ export class NatsJetStreamServer
266
510
  private async createConsumer(
267
511
  js: JetStreamClient,
268
512
  consumerName: string,
269
- { streamName, mapping }: ConsumerInfo,
270
- options: Partial<ConsumerConfig>,
513
+ { streamName, mapping, maxAckPending }: ConsumerInfo,
514
+ options: Partial<ConsumerConfig> & { filter_subjects: string[] },
271
515
  ): Promise<void> {
272
516
  try {
273
517
  await js.streams.get(streamName);
@@ -280,9 +524,7 @@ export class NatsJetStreamServer
280
524
  }
281
525
 
282
526
  const jsm = await js.jetstreamManager();
283
- const expectedSubjects: string[] = [...mapping.values()].flatMap((e) =>
284
- this.getEventSubjects(e.deserializer),
285
- );
527
+
286
528
  const ackPolicy = [...mapping.values()][0].deserializer.options?.ackPolicy;
287
529
 
288
530
  const consumer: Consumer =
@@ -294,9 +536,9 @@ export class NatsJetStreamServer
294
536
  streamName,
295
537
  omitUndefined({
296
538
  ...options,
539
+ max_ack_pending: maxAckPending,
297
540
  ack_policy: ackPolicy,
298
541
  durable_name: consumerName,
299
- filter_subjects: expectedSubjects,
300
542
  }),
301
543
  )
302
544
  .then(() => this.getConsumer(js, streamName, consumerName)));
@@ -308,7 +550,7 @@ export class NatsJetStreamServer
308
550
  jsm,
309
551
  streamName,
310
552
  consumerName,
311
- expectedSubjects,
553
+ options.filter_subjects,
312
554
  receivedSubjects,
313
555
  );
314
556
 
@@ -417,16 +659,27 @@ export class NatsJetStreamServer
417
659
  * @returns Имя консьюмера.
418
660
  */
419
661
  private getConsumerName(contract: EventTypeWithOptions): string {
420
- const arr = [
421
- this.normalizedApplicationName,
422
- this.getStreamName(contract),
423
- 'consumer',
424
- ];
662
+ const arr: string[] = [];
425
663
 
426
664
  if (contract.options?.consumerName) {
427
- arr.unshift(contract.options.consumerName);
665
+ arr.push(contract.options.consumerName);
428
666
  }
429
667
 
668
+ const maxAckPending = `${
669
+ contract.options?.maxAckPending === -1
670
+ ? 'infinite'
671
+ : (contract.options?.maxAckPending ?? DEFAULT_MAX_ACK_PENDING)
672
+ }`;
673
+
674
+ arr.push(
675
+ this.normalizedApplicationName,
676
+ this.getStreamName(contract),
677
+ 'maxAckPending',
678
+ maxAckPending,
679
+ 'ackPolicy',
680
+ contract.options?.ackPolicy ?? AckPolicy.None,
681
+ );
682
+
430
683
  return arr.join('-');
431
684
  }
432
685
 
@@ -436,7 +689,11 @@ export class NatsJetStreamServer
436
689
  * @returns Темы событий.
437
690
  */
438
691
  private getEventSubjects(contract: EventTypeWithOptions): string[] {
439
- return contract.options?.subjects ?? [];
692
+ return (
693
+ contract.options?.subjects ?? [
694
+ getSubjectName(contract.type, contract.options?.partition),
695
+ ]
696
+ );
440
697
  }
441
698
 
442
699
  /**
@@ -449,4 +706,16 @@ export class NatsJetStreamServer
449
706
  typeof eventType === 'string' ? eventType : eventType.$type
450
707
  ).replaceAll('.', '-');
451
708
  }
709
+
710
+ private isNatsVersionAtLeast(
711
+ version: string,
712
+ minMajor: number,
713
+ minMinor: number,
714
+ minPatch: number,
715
+ ): boolean {
716
+ const [major, minor, patch] = version.split('-')[0].split('.').map(Number);
717
+ if (major !== minMajor) return major > minMajor;
718
+ if (minor !== minMinor) return minor > minMinor;
719
+ return patch >= minPatch;
720
+ }
452
721
  }
@@ -6,4 +6,5 @@ export type ConsumeOptions = {
6
6
  maxAckPending?: number;
7
7
  consumerName?: string;
8
8
  ackPolicy?: AckPolicy;
9
+ partition?: string;
9
10
  };
@@ -3,4 +3,5 @@ import type { Mapping } from './mapping.type';
3
3
  export type ConsumerInfo = {
4
4
  streamName: string;
5
5
  mapping: Mapping;
6
+ maxAckPending: number;
6
7
  };