Может ли издатель NATS отправить одно сообщение в несколько очередей?

Я строю систему, в которой двум разным сущностям нужно обрабатывать сообщения из одного и того же источника (по-разному - например, один будет регистрировать все сообщения, в то время как другой может захотеть объединить данные).

В идеале каждый объект полностью масштабируется для обеспечения производительности и отказоустойчивости, поэтому у нас есть несколько издателей, несколько подписчиков журнала и несколько подписчиков агрегации, но, тем не менее, каждое сообщение, сгенерированное каждым опубликованным, обрабатывается ровно одним подписчиком журнала и одним подписчиком агрегации.

С помощью AMQP мы можем добиться этого, публикуя информацию на разветвленном обмене, который распределяет сообщения по двум очередям, где каждая очередь имеет много подписчиков. Я понимаю, что такое же поведение может быть достигнуто в NATS, просто заставляя всех подписчиков прослушивать один и тот же "субъект", используя два разных "имени группы очередей" на основе их ролей.

В таком случае сообщения субъекту будут доставляться одному подписчику из каждой группы очередей, то есть каждое сообщение будет доставлено ровно n раз, причем n - это число отдельных групп очередей, а не количество подписчиков. Это правильно?

2 ответа

Решение

Действительно, вы можете использовать подписчиков очереди (например, в Go, это будет такой API: func (nc *Conn) QueueSubscribe(subj, queue string, cb MsgHandler) (*Subscription, error),

queue это имя группы. Например, это может быть в вашем примере log а также aggregation, Вы можете создать столько подписчиков очереди в каждой из этих групп, и только 1 участник в каждой группе получит данное сообщение.

Например, предположим, что вы публикуете сообщение на тему foo и у вас есть 10 подписчиков очереди foo с именем очереди log и 10 абонентов очереди на foo с именем очереди aggregation, Сообщение будет доставлено 2 подписчикам, 1 для группы log и 1 для группы aggregation,

Надеюсь это поможет.

Ваш подход правильный, концепция очереди в nats.io заключается в последовательном распределении сообщения среди подписчиков, слушающих очередь. Это распределение происходит линейно, предположим, что у вас есть 10 подписчиков (S1- S10), слушающих тему и зарегистрированных в одной и той же очереди, затем первое сообщение будет отправлено на S1, затем на S2 и так далее циклическим образом.

Вам просто нужно убедиться, что все подписчики подключены к серверу, как если бы абонент отключился, сервер nats узнает об этом событии после определенных невыполненных запросов PING-PONG, и в течение этого интервала он будет пересылать сообщения на сервер. автономный узел. Таким образом, вам нужно тщательно установить

  1. PING-PONG интервал
  2. Максимальное количество невыполненных запросов PING

https://nats.io/documentation/server/gnatsd-config/

Другие вопросы по тегам