Как лучше всего отправлять асинхронные сообщения об отсутствии ответа между одноранговыми узлами с помощью ØMQ?

У меня есть небольшой кластер одноранговых узлов (например, 10 узлов), которые уже публикуют и подписываются на сообщения. Это работает нормально. Кластер статичен, и каждый узел знает адреса других узлов.

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

Какие шаблоны и типы сокетов можно использовать для реализации этого?

Я новичок в ØMQ и просмотрел шаблон Freelance из руководства, подробнее в частности, Модель 3 – сложная и неприятная. Уместен ли в моем случае описанный там подход ROUTER-ROUTER?

Я думаю о том, чтобы каждый узел привязывался к сокету ROUTER, устанавливая свой адрес как идентификатор (и «опрашивая» его в своем цикле сообщений), а также позволяя узлу отправлять данные через сокет ROUTER, указывая адрес принимающего узла как идентификатор.

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


person tle    schedule 26.03.2012    source источник


Ответы (1)


Для отправки работы одноранговому узлу без ответа я бы, вероятно, просто использовал шаблон разветвления, который позволит вам более эффективно «запустить и забыть».

Маршрутизатор и дилер действительно существуют для уровня «устройства» в «расширенном» шаблоне запроса/ответа.

person Shaun    schedule 29.03.2012
comment
Может быть, я что-то упускаю, но как разветвление позволяет мне отправить сообщение только определенному узлу? - person tle; 02.04.2012
comment
У вас будет только один узел, выполняющий PULL, а не ряд узлов. Другими словами, когда вам нужно использовать конкретный вариант использования узла, у вас есть одна пара PUSH и одна PULL. При выполнении PUSH не ожидается, что вы получите что-либо взамен, поэтому, на мой взгляд, это лучшая асинхронная метафора, чем REQ/REP. Вы также можете использовать PUB/SUB между отдельными узлами, если вы просто хотите повторно использовать то, что у вас уже есть, архитектурно. - person Shaun; 02.04.2012
comment
PUSH-PULL не будет отбрасывать сообщения, если получатель не работает, в соответствии с документом, что означает, что если ваш удаленный узел выйдет из строя (одноранговый узел, которому вы отправляете) и вернется, он получит кучу старых сообщений. Вы, конечно, можете смягчить эту проблему, отслеживая статус получателя (посредством сердцебиения или эквивалентного) и закрывая сокет PUSh, как только узел выходит из строя (возможно, с linger=0). - person Erik Kaplun; 07.09.2012
comment
какой из них вы подразумеваете под шаблоном Fanout? любой пример ссылки? - person Louis Rhys; 16.04.2013
comment
Лучший совет, который я могу дать, — это ознакомиться с отличным руководством по ZeroMQ: zguide.zeromq.org/page:all В целом, разветвление/расширение – это распространенные шаблоны обмена сообщениями, поддерживаемые различными архитектурами, ориентированными на сообщения. - person Shaun; 16.04.2013
comment
Еще немного информации для вас: разветвление/разветвление поддерживаются ZeroMQ через типы сокетов PUSH/PULL. RabbitMQ, с другой стороны, имеет тип обмена «разветвление». Надеюсь это поможет. - person Shaun; 16.04.2013