Проблемы с инвертированным PUB / SUB с ZeroMQ - PullRequest
6 голосов
/ 23 апреля 2011

Я пытаюсь настроить "инвертированный" PUB / SUB с ZeroMQ.

означает, что подписывающиеся (SUB) сокеты принадлежат нескольким долгоживущим серверам, делая zmq_bind(); и публикация (PUB) сокета является недолговечным клиентом и делает zmq_connect().

Я использую одну ipc:// розетку.

Я ожидаю, что сообщение от издателя достигнет каждого из подписчиков.

Проблема: только один из процессов подписчика получает сообщения. Если этот процесс умирает, издатель застревает в zmq_term().

Этот режим операций поддерживается zmq? Если да, то что я делаю не так? Если нет, то как реализовать то, что мне нужно?

Минимальный пример с некоторыми дополнительными деталями (в Lua, но это не должно иметь значения): https://gist.github.com/938429

Ответы [ 3 ]

6 голосов
/ 23 апреля 2011

Вы не можете привязать несколько сокетов к одному ipc:// адресу (здесь речь идет о доменном сокете Unix ipc: ///tmp/test.ipc == file /tmp/test.ipc).

Что вы можете сделать, это привязать каждый SUB-сокет к отдельному IPC-адресу: // и заставить издателя подключить один PUB-сокет к каждому из этих адресов. ZeroMQ позволяет одному сокету связывать / подключаться к нескольким адресам.

Блокировка функции zmq_term (), скорее всего, устраняет проблему закрытия (т. Е. Есть сообщение, которое пытается отправить PUB-сокет). Посмотрите на опцию ZMQ_LINGER .

4 голосов
/ 21 ноября 2012

Существует одна особенность транспорта ipc: //, заключающаяся в том, что если два процесса связываются с одной и той же конечной точкой IPC, второй будет молча украсть привязку у первой. Эта «функция» была сделана, чтобы позволить процессам легко восстанавливаться после сбоя.

Вот почему сообщения получает только один подписчик.

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

2 голосов
/ 25 апреля 2011

Вы не можете привязать несколько сокетов к одному и тому же адресу на одном компьютере, будь то ipc или tcp, SUB / PUB или REQ / REP.Это похоже на привязку сетевого сокета.

Способ отправки сообщений всем подписчикам от многих издателей заключается в реализации простого посредника, который связывается с SUB-адресом и PUB-адресом.Издатели подключаются к SUB-сокету для отправки сообщений, а подписчики подключаются к PUB-сокету того же брокера, а брокер просто перенаправляет все сообщения, полученные из SUB-сокета, в PUB-сокет.Это требует некоторого снижения производительности, но его довольно просто программировать.

В ZeroMQ 2.0 есть исполняемый файл zmq_forwarder, который можно использовать только для этой цели, в 2.1 см. Функцию zmq_device (3).

...