Может ли издатель 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, и в течение этого интервала он будет пересылать сообщения на сервер. автономный узел. Таким образом, вам нужно тщательно установить
- PING-PONG интервал
- Максимальное количество невыполненных запросов PING