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 они недоступны.
Комментариев нет :
Отправить комментарий