Кажется, что может возникнуть недоразумение в отношении того, что делает ваш код.
frontend = context.socket(zmq.ROUTER)
Этот код создает ROUTER
гнездо и сохраняет его в frontend
. frontend
- теперь разъем ROUTER
.
frontend.bind("tcp://*:5555")
frontend.bind("tcp://*:5558")
Этот код bind()
Этот единственный разъем на несколько конечных точек. Я думал, что для этой цели существует другая семантика в течение одного звонка до bind()
, но this link, похоже, указывает, что вы делаете это так, как вы это сделали.
Вы не можете связывать несколько гнезд с одинаковыми конечной точкой. Вы получите сообщение об ошибке, что этот адрес используется. В вашем случае, если вам действительно необходимы два гнезда, вы должны сделать что-то вроде следующего, специфика будет в значительной степени зависеть от конкретного случая использования:
context = zmq.Context()
frontend1 = context.socket(zmq.ROUTER)
frontend2 = context.socket(zmq.ROUTER)
backend1 = context.socket(zmq.DEALER)
backend2 = context.socket(zmq.DEALER)
frontend1.bind("tcp://*:5555")
frontend2.bind("tcp://*:5558")
backend1.bind("tcp://*:5556")
backend2.bind("tcp://*:5557")
... Однако, я бы не стал порекомендуйте, что, не сталкиваясь с конкретной проблемой, которая не может быть решена на одном сокете (который, я полагаю, является тем, что ваш вопрос здесь в первую очередь, ответил внизу).
Перед тем, как попасть в это, ваш брокер здесь выступают в качестве простого экспедиторского прокси, и есть более прямая Семантика ZMQ для достижения этой цели с zmq_proxy()
, вы можете увидеть пример here, соответствующие биты копируются здесь:
context = zmq.Context()
# Socket facing clients
frontend = context.socket(zmq.ROUTER)
frontend.bind("tcp://*:5559")
# Socket facing services
backend = context.socket(zmq.DEALER)
backend.bind("tcp://*:5560")
zmq.proxy(frontend, backend)
# We never get here…
frontend.close()
backend.close()
context.term()
... этот код выполняет то же самое, что и ваш код, в более подходящем «ZMQ» способе. Этот пример кода пришел из ZMQ Guide, в этом руководстве есть множество примеров с кодом Python, я настоятельно рекомендую вам прочитать его.
SO, вот ответ на вопрос (перефразировать) «Когда разработчик должен выбрать, чтобы использовать более чем один разъем для обслуживания конкретной потребности службы»:
Очень редко. Один разъем ZMQ может теоретически обрабатывать миллионов сообщений в секунду.Размер сообщения имеет значение, конечно, вы ограничены пропускной способностью вашего соединения, а перемещение материала в памяти не является бесплатным, но теоретически один сокет ZMQ может обрабатывать большинство общих рабочих нагрузок. Если вы хотите загрузить баланс, вы обычно начнете новый процесс, возможно, на целом отдельном хосте, но он может работать, разворачивая второй сокет в рамках одного и того же процесса, просто зависит от того, что ваш chokepoint - это, вероятно, будет какой-то другой системный ресурс, прежде чем он станет сокетом ZMQ, но это определение будет исходить из специфики вашего приложения.
Итак, в общем, начните с одного сокета и сжимайте столько, сколько сможете, и когда вы увидите, что производительность может быть улучшена путем масштабирования по горизонтали, посмотрите на специфику вашей ситуации, чтобы определить лучший способ для этого.