Объединение pub / sub с req / rep в zeromq - PullRequest
12 голосов
/ 16 июля 2011

Как клиент может подписаться и прослушать ответы с помощью zeromq? То есть на стороне клиента я хотел бы запустить цикл, который только принимает сообщения и выборочно отправляет запросы, а на стороне сервера я хотел бы публиковать большую часть времени, но иногда также получать запросы. Похоже, у меня будет два разных сокета - по одному для каждого способа общения. Можно ли избежать этого и на стороне сервера получать «уведомления о запросах» из сокета в потоке обратного вызова zeromq, одновременно отправляя сообщения в сокет в моем собственном потоке?

Ответы [ 3 ]

15 голосов
/ 16 июля 2011

Я ужасно новичок в ZeroMQ, поэтому я не уверен, считается ли то, что вы хотите, наилучшей практикой или нет.Тем не менее, решение с использованием нескольких сокетов довольно просто с использованием zmq_poll.

. Основная идея заключается в том, чтобы иметь и клиента, и сервер:

  • открыть сокет для pub / sub
  • открыть сокет для req / rep
  • мультиплексировать отправку и прием между двумя сокетами в цикле, используя zmq_poll в бесконечном цикле
  • , процесс req / rep и pub /под-события в цикле по мере их возникновения

Использование zmq_poll таким образом с несколькими сокетами - это хорошо, потому что оно полностью избегает потоков.В руководстве 0MQ есть хороший пример здесь .Обратите внимание, что в этом примере они используют тайм-аут -1 в zmq_poll, который заставляет его блокироваться, пока не произойдет хотя бы одно событие в любом из мультиплексированных сокетов, но довольно часто используется тайм-аут x миллисекунд или что-то вродеесли ваш цикл должен выполнять какую-то другую работу.

2 голосов
/ 20 июля 2011

Вы можете использовать 2 потока для обработки различных сокетов.Сложность заключается в том, что если вам нужно обмениваться данными между потоками, вам нужно синхронизировать их безопасным способом.

Альтернативой является использование ZeroMQ Poller для выбора сокетов, на которых есть новые данные.Затем процесс будет использовать один цикл, как объяснил bjlaub.

1 голос
/ 03 мая 2016

Это может быть выполнено с использованием варианта / подмножества Majordomo Protocol . Вот идея:

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

...