пятница, 18 марта 2016 г.

30. ZeroMQ и Delphi. ZMQ 4.2: threas-safe сокеты ZMQ_CLIENT и ZMQ_SERVER. Новая модель связи Client-Server.

ZMQ 4.2: новые thread-safe сокеты ZMQ_CLIENT и ZMQ_SERVER, новая модель Client-Server



  Модель Client-Server обеспечивает общение одного сокета ZMQ_SERVER с одним (или множество) сокетами ZMQ_CLIENT. Клиент начинает общение, далее общение между клиентом и сервером происходит в асинхронном режиме, как между равнозначными партнерами.

Новая модель предназначена для замены старой модели Rлиент-Cервер с использованием пар сокетов ZMQ_DEALER/ZMQ_ROUTER и пар ZMQ_REQ/ZMQ_REP для схемы Запрос-Ответ.
Формальное описание нового шаблона можно найти здесь.


ZMQ_CLIENT



Сокет ZMQ_CLIENT общается с сокетом ZMQ_SERVER. Подключиться может любой из корреспондентов хотя обычно рекомендуется для операции bin() использовать ZMQ_SERVER, а для операции connect() - ZMQ_CLIENT .

После того, как ZMQ_CLIENT установит соединение, с помощью zmq_send можно будет отправлять соощения, помещать из во встроенную очередь и отправлять по сети, как только сеть будет готова их принять. Объем исходящей очереди определяется значением вотермарка для данного сокета.  Если исходящий буфер полон, или если нет подключенного корреспондента, метод zmq_send () по умолчанию будет блокировать дальнейшую работу. Таким образом, сокет ZMQ_CLIENT сообщения отбрасывать не будет.

Если сокет ZMQ_CLIENT подключается к нескольким сокетам ZMQ_SERVER, исходящие сообщения будут циклически распределяться между подключенными корреспондентами. Аналогично, сокет ZMQ_CLIENT будет получать сообщения от каждого подключенного корреспондента/ Такой режим  имеет смысл только для случая, протокол не требует запоминать состояние корреспондента.

Сокеты ZMQ_CLIENT - thread-safe! Они могут использоваться одновременно из нескольких нитей. Следует обратить внимание, что ответы от сокета ZMQ_SERVER будут приходить к той клиентской нити, которая первой вызвала libzmq: zmq_msg_recv. Если нужно отправить ответы обратно в исходную нить, следует использовать по одному сокету ZMQ_CLIENT для каждой нити.


И так, сокеты ZMQ_CLIENT являются thread-safe. При отправке сообщений нельзя использовать опцию ZMQ_SNDMORE и ZMQ_RCVMORE при приеме. То есть, сообщения состоят только из одной части. Это сделано с целью расширить API, которое позволит собирать/разбирать данные из нескольких частей.

Общие характеристики сокетов ZMQ_CLIENT
Работают в паре с сокетамиZMQ_SERVER
Направление передачиДвунаправленный
Модель связиБез ограничений
Маршрутизация исходящих сообщенийКруговая
Маршрутизация входящих сообщенийFair-очеред
Действие в "немом" состоянииБлокировка

ZMQ_SERVER


Сокет ZMQ_SERVER общается с множеством сокетов ZMQ_CLIENT. Сокет ZMQ_SERVER может лишь отвечать на входящее сообщение, общение всегда начинает сокет ZMQ_CLIENT.

Каждое полученное сообщение имеет routing_id, который представляет собой 32-разрядное целое число без знака. Приложение может узнать его с помощью сzmq_msg_routing_id(). Для отправки сообщения на нужный ZMQ_CLIENT, сообщению нужно установить нужное значение корреспондентского routing_id с помощью zmq_msg_set_routing_id() .

Если routing_id не указан, или не относится ни к одному подключенному клиенту, попытка отправить потерпит неудачу с кодом завершения EHOSTUNREACH. Если исходящий буфер для клиента переполнен, попытка отправить сообщение потерпит неудачу с кодом EAGAIN. Таким образом, сокет ZMQ_SERVER не отбрасывает сообщения и не переходит в режим блокирования..


Конечно же, сокеты ZMQ_SERVER так же являются thread-safe. Так же они не принимают опции ZMQ_SNDMORE и ZMQ_RCVMORE. То есть, они работают с сообщениями, состоящими только из одной части. Это сделано с целью расширить API, которое позволит собирать/разбирать данные из нескольких частей.
Общие характеристики сокетовZMQ_SERVER
Работают в паре с скокетамиZMQ_CLIENT
Направление передачиДвунаправленный
Модель связиБез ограничений
Маршрутизация исходящих сообщенийСмотри описание
Маршрутизация входящих сообщенийFair-очереди
Действие в "немом" состоянииВозвращение EAGAIN

К сожалению, такие сокеты можно будет использовать только в Windows версии Vista (и более новых). В Windows XP они недоступны.


Комментариев нет :

Отправить комментарий