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

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

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

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

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


person Guss    schedule 06.07.2017    source источник


Ответы (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.

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

person I. Kozlovic    schedule 06.07.2017

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

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

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

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

person ritesh4302    schedule 05.10.2017
comment
Вы хотите сказать, что если у подписчика произойдет сбой, мы потеряем данные? - person Guss; 05.10.2017
comment
Если подписчик переходит в автономный режим, то сервер nats узнает об этом событии по истечении определенного времени ожидания, и в течение этого времени в нашем случае может произойти потеря данных. - person ritesh4302; 05.10.2017