Несколько издателей и подписчиков в nanomsg (nng)
Как настроить несколько издателей и подписчиков с помощью транспорта TCP. Я подозреваю, что вы не делаете автоматическое создание сетки / шины. Таким образом, каждому издателю нужна уникальная точка привязки IP-адреса, верно? У них просто есть подписчики, которые подключаются к каждому издателю через один сокет.
(это обсуждалось в: https://www.freelists.org/post/nanomsg/does-nanomsg-support-multi-producer-in-pubsub-mode,10)
Это в основном правильно?
Причина, по которой я склоняюсь к пабу / сабву по подходу шины / сетки, заключается в том, что (и я признаю, что вполне могу ошибаться)
- Мне не нужна полностью подключенная сетка
- Я полагаю, что фильтрация по основному дереву в каждом узле лучше, чем я бы придумал
- Мне нравится аспект auto-discovery для pub/sub, а не ручная разводка сетки для автобусных транспортов.
- (т.е. автоматический "вход и выход из сетки")
По сути, у меня есть 2 производителя (которые в основном занимаются публикацией, но могут время от времени получать запросы на добавление дополнительной информации о публикуемом потоке, поэтому им нужно прислушиваться). А затем о пяти потребителях, которые в основном получают поток данных из издатели, но нужно время от времени отправлять запросы производителям.
И да, я хочу, чтобы pub был асинхронным, а также recv() для подписки (в контексте, где я это использую, блокировка запрещена).
Так что это двунаправленная архитектура паб / саб. И я смотрю на самый простой способ реализовать это. (движение довольно легкое).
Конечно, транспорт UDP был бы хорош для этого, но я не держу дыхание.
2 ответа
NanoMSG NNG является очень симметричным и ортогональным. У меня была пара бесед с Гдамором.
Каждая конечная точка может быть push, req, bus или любой другой. Вы можете иметь несколько конечных точек (например, 2 push или push и req/res). Протокол может быть в любом направлении. Rec может быть блокирующим, асинхронным или основанным на опросе.
Если вы хотите увидеть, как это сделать, смотрите:
Легко:
Использовать NN_PUB/NN_SUB
как это было разработано, для неблокирующего, асинхронного, широковещательного направления.
Используйте другой асинхронный канал "снизу вверх", будь то NN_PAIR/NN_PAIR
или любой другой, более сложный шаблон архетипа Scalable Formal Communication, например NN_PUSH/NN_PULL
или наоборот NN_PUB/NN_SUB
это соответствует как вашим намерениям, так и целям латентности.
Рабочие процессы будут свободны .nn_send()
всякий раз, когда кто-то чувствует такую потребность, а остальное находится в руках "центрального" процесса.
Принимая во внимание масштабирование 1:5, и рабочие процессы просты, как вы писали ранее, в этом действительно нет скрытых ловушек, за исключением потерянных сообщений (опять же, основное решение для надежного протокола доставки сообщений уже было предложено в более ранней публикации).
На "центральном" узле, там вы просто .nn_poll()
эти каналы сигнализации регулярно (опять же, неблокирующим асинхронным образом) и .nn_recv()
данные только в том случае, когда на таком канале POSACK уже есть сообщение о том, что оно уже присутствует там для выборки и обработки на стороне кода вашего приложения.
Это все, что вам нужно.