2013-06-20 2 views
3

У меня есть разъем DEALER, который подключается к гнезду ROUTER, однако сокет ROUTER может время от времени отключать и повторно связываться с одним и тем же портом (из-за закрытия приложения и повторного запуска, который связывает сокет).ZeroMQ, сообщения, отправленные DEALER -> отключенным ROUTER, не отбрасываются. Как это изменить?

Как я могу гарантировать, что все сообщения, отправленные DEALER, будут отброшены или удалены? В тот момент, когда сокет ROUTER снова связан, тогда принимается множество сообщений, исходящих из DEALER. Я хочу, чтобы все исходящие сообщения DEALER были отброшены, которые были отправлены в сокет ROUTER, в то время как сокет ROUTER не был связан. Есть ли способ настроить настройки? Обратите внимание, что гнездо ROUTER не может закрываться или управляться контролируемым образом, так как я хочу также обрабатывать полные сбои приложений.

Большое спасибо за любые указатели ...

ответ

5

Процесс, который управляет сокет ДИЛЕР нужно будет расширить, чтобы обнаружить, что подключение к роутеру ушел. Затем вам нужно закрыть сокет DEALER (с установкой LINGER в 0, чтобы отбросить все сообщения в очереди), создать новый сокет и снова подключиться. Периодически повторяйте, пока не будет установлено соединение.

Отъезд http://zguide.zeromq.org/page:all и прочитать «Параноидальный паттерн пирата». Параноидальный пиратский работник имеет ту же проблему. Это разъем DEALER, подключающийся к ROUTER, и его необходимо снова подключить, когда ROUTER спускается.

Это решение использует сердцебиение, чтобы определить, когда соединение ушло. Руководство предупреждает, что это может быть трудно получить сердцебиение правильно, поэтому имейте это в виду, когда вы рассматриваете альтернативы.

Другой подход: обратите внимание, что API 3.2 содержит новый API-интерфейс сокета, который создает гнездо PAIR, которое может использоваться для контроля состояния существующего сокета. Это может позволить вам обнаружить, что соединение DEALER с ROUTER прошло без использования heartbeating - но я не использовал этот API самостоятельно. Как только вы обнаружите, что соединение исчезло, закройте сокет, повторите попытку, повторите, как указано выше.

+0

отлично, много полезных советов, очень цените усилие. Я на самом деле реализовал дуплексное сердцебиение (одно происходит с серверной стороны, другое с клиентской стороны, а на самом деле только клиенты отправляют «пинги», серверы отвечают «понгами», но на стороне сервера он проверяет, часто ли пинги принимаются каждым подключенным клиент для определения состояния соединения). Это работает хорошо. И теперь ваши советы, которые дилер отключает, действительно помогают. Один вопрос, кажется, я не вижу Версии 3.2 для .Net в любом месте. Любые указатели? –

+0

Рад, что я мог бы помочь. Извините - не знаю о статусе API 3.2 в .Net. Я использую только C и Java. Я использую базу кода 3.2, но я использую только функции 2.x. –

+0

Не беспокойтесь, спасибо в любом случае !!! –

Смежные вопросы