Как реализовать асинхронный чат для обмена мгновенными сообщениями с помощью ZeroMq

Подход

Я создаю асинхронное приложение для обмена мгновенными сообщениями/чата с помощью ZeroMq в качестве учебного упражнения, используя следующий подход.

Сервер использует два сокета ROUTER, подобные lbbroker.java, читая из incoming и записывая в outgoing, манипулируя конвертом для доставки предполагаемому получателю.

Клиенты устанавливают уникальный идентификатор с помощью socket.setIdentity() и используют сокеты PULL и PUSH вместо REQ/REP для асинхронной отправки и получения сообщений чата. Я построил и протестировал код, все работает нормально.

Асинхронный чат

Вопросы

  • Является ли использование PUSH/PULL с ROUTER допустимым подходом?

  • Почему чат-клиенты становятся недоступными при отключении, а затем повторном подключении?

Салли становится недоступной, если она отключается, а затем снова подключается, она больше не может получать сообщения чата. После отладки сервера я подтвердил, что он определенно отправляет Салли сообщения с правильным конвертом. Я также использовал outgoing.setRouterMandatory(true), чтобы сервер не отбрасывал неадресуемые сообщения, но никаких ошибок не возникало.


person raffian    schedule 05.08.2013    source источник


Ответы (1)


После дальнейших исследований, несмотря на то, что сокеты PUSH и PULL работают с ROUTER, они не являются допустимыми комбинациями сокетов в соответствии со спецификацией ZeroMq.

Сокет DEALER на стороне клиента — лучший подход. DEALER поддерживает двунаправленную передачу сообщений, в основном выполняя работу PUSH и PULL, но с одним сокетом.

Я создал тему на Github для обсуждения этой проблемы, она включает пример кода для шаблона на основе агента с использованием DEALER.

https://github.com/zeromq/jeromq/issues/81

person raffian    schedule 23.09.2013