PUB/SUB могу ли я использовать .connect() перед .bind()?

Я использую дизайн PUB/SUB, и мой вопрос:

Могу ли я .bind() подключиться к порту после того, как другой сокет .connect() подключился к нему, или я должен .bind() до того, как другой сокет попытается .connect() подключиться к тому же адресу?

Другими словами:

Имеет ли значение порядок .bind() и .connect()?

(Я думаю, что этот вопрос не специфичен для PUB/SUB, но актуален для любого дизайна).


person barakcaf    schedule 21.10.2015    source источник


Ответы (2)


Основной принцип ZMQ заключается в том, чтобы не беспокоиться о том, существует ли сокет, к которому вы пытаетесь подключиться, или нет. Это детали, которые ZMQ пытается абстрагировать от вас, разработчика. Итак, нет, порядок bind() и connect() не имеет значения для любого типа сокета.

Я предлагаю вам прочитать руководство по zmq, если вы планируете активно работать с ним, соответствующую часть здесь:

Помните, что ZeroMQ выполняет асинхронный ввод-вывод, т. е. в фоновом режиме. Скажем, у вас есть два узла, которые делают это в следующем порядке:

  • Подписчик подключается к конечной точке, получает и подсчитывает сообщения.
  • Издатель привязывается к конечной точке и немедленно отправляет 1000 сообщений.

Тогда абонент, скорее всего, ничего не получит. Вы моргнёте, проверьте правильность установки фильтра и повторите попытку, а подписчик всё равно ничего не получит.

... здесь важно отметить важный момент для PUB/SUB: даже если вы connect() сначала со своим подписчиком, это соединение на самом деле не происходит до тех пор, пока после издателя имеет bind()-ed, поэтому, если вы попытаетесь отправить сообщения своему издателю, не дожидаясь, пока ваш подписчик завершит соединение, эти сообщения никогда не дойдут до вашего подписчика.

person Jason    schedule 21.10.2015
comment
tnx именно то, что я искал - person barakcaf; 21.10.2015

Это зависит от одноадресного транспорта, транспортные классы tcp:// и ipc:// отключены, поэтому порядок .bind() и .connect() не имеет значения.

Но подключен транспортный класс inproc://, поэтому сначала нужно .bind(), а затем .connect().

http://zguide.zeromq.org/page:all#Unicast-Transports

person Mauricio Moura    schedule 02.02.2017
comment
Я думаю, это зависит от того, какая оболочка используется. Я попробовал это с помощью pyzmq в этой сущности, и сообщения передаются. - person FirefoxMetzger; 02.07.2017