PUB/SUB я могу.connect(), прежде чем я.bind()?
Я использую PUB
/ SUB
дизайн и мой вопрос:
Могу я .bind()
в порт после другого сокета .connect()
на это, или я должен .bind()
прежде чем другой сокет пытается .connect()
по тому же адресу?
Другими словами:
Есть ли порядок .bind()
а также .connect()
иметь значение?
(Я думаю, что этот вопрос не относится к PUB
/ SUB
но актуально для любого дизайна).
2 ответа
Основной принцип ZMQ - не беспокоиться о том, есть ли сокет, к которому вы пытаетесь подключиться, уже есть или нет. Это детали, которые ZMQ пытается абстрагироваться от вас, разработчика. Итак, нет, порядок bind()
а также connect()
не имеет значения для любого типа сокета.
Я предлагаю вам прочитать руководство по zmq, если вы планируете проделать большую работу с ним, соответствующую часть здесь:
Помните, что ZeroMQ выполняет асинхронный ввод-вывод, т. Е. В фоновом режиме. Скажем, у вас есть два узла, которые делают это в следующем порядке:
- Абонент подключается к конечной точке и получает и считает сообщения.
- Издатель связывается с конечной точкой и немедленно отправляет 1000 сообщений.
Тогда, скорее всего, абонент ничего не получит. Вы будете мигать, убедитесь, что вы установили правильный фильтр, и повторите попытку, и подписчик все равно ничего не получит.
... здесь есть важный момент для PUB/SUB - даже если вы connect()
сначала с вашим подписчиком, это соединение на самом деле не происходит до тех пор, пока издатель не bind()
-ed, поэтому, если вы попытаетесь отправить сообщения своему издателю, не дожидаясь, пока ваш подписчик завершит соединение, эти сообщения никогда не будут переданы вашему подписчику.
Это зависит от одноадресного транспорта, tcp://
а также ipc://
транспортные классы отключены, поэтому порядок .bind()
а также .connect()
не имеет значения.
Но inproc://
транспортный класс подключен, поэтому есть необходимость .bind()
сначала, а потом .connect()
,