(zmq/backend/cython/socket.c:4076)
File "checkrc.pxd", line 21, in zmq.backend.cython.checkrc._check_rc
(zmq/backend/cython/socket.c:6032)
zmq.error.ZMQError: Address already in use
Сообщения нужно отправлять как байтовые строки, поэтому в нашем примере
мы закодировали строки в формате UTF-8. Вы можете отправить любое количество
сообщений, если будете преобразовывать их в тип bytes. Мы использовали простые
текстовые строки как источник сообщений, поэтому методов encode() и decode()
будет достаточно, для того чтобы преобразовать их в байтовые строки и обратно.
Если ваши сообщения имеют другие типы данных, можете использовать библио-
теку вроде MessagePack (http://msgpack.org/).
Даже этот простой шаблон REQ — REP позволяет реализовать некоторые шаблоны
коммуникации, поскольку любое количество клиентов REQ может использовать
метод connect(), чтобы соединиться с единственным сервером REP. Сервер обраба-
тывает запросы синхронно по одному за раз, но не сбрасывает другие запросы,
ожидающие его внимания. ZeroMQ буферизует сообщения до определенного ли-
мита; именно из-за этого в его имени находится буква Q. Здесь Q расшифровывает-
ся как Queue — очередь, M — как Message — сообщение, а Zero (ноль) означает, что
ему не нужны посредники.
Несмотря на то что ZeroMQ не предоставляет никаких центральных брокеров
(промежуточных участников), вы можете создать их в любой момент. Например,
используйте сокеты DEALER и ROUTER, чтобы асинхронно подключиться к нескольким
источникам и/или конечным точкам.
Несколько сокетов REQ подключаются к одному сокету ROUTER, который пере-
дает каждый запрос сокету DEALER, который, в свою очередь, связывается с подклю-
ченным к нему сокетом REP (рис. 11.1). Это похоже на то, как несколько браузеров
связываются с прокси-сервером, расположенным перед фермой веб-серверов. Это
позволяет вам при необходимости добавить несколько клиентов и серверов.
Сокеты REQ соединяются только с сокетом ROUTER, сокет DEALER соединяется с не-
сколькими сокетами REP, лежащими позади него. ZeroMQ заботится о деталях,
гарантируя, что нагрузка, создаваемая запросами, сбалансирована и что ответы
будут возвращаться по правильному адресу.
Еще один сетевой шаблон называется «вентилятор», в его рамках используют-
ся сокеты PUSH — для того, чтобы перепоручать асинхронные задачи, и сокеты
PULL — для того, чтобы собирать результаты.
Последней значимой особенностью ZeroMQ является возможность масштаби-
роваться, просто изменив тип соединения с сокетом при его создании:
tcp выполняет соединение между процессами на одной или нескольких машинах;
ipc выполняет соединение между процессами на одной машине;
inproc выполняет соединение между потоками одного процесса.
Сети
331
Рис. 11.1. Использование посредника для соединения с несколькими клиентами и серверами
Последнее соединение, inproc — это способ передать данные между потоками,
избежав блокировок, он является альтернативой примеру работы с потоками, по-
казанному в разделе «Потоки» данной главы.
После использования ZeroMQ вы, возможно, больше не захотите возвращаться
к написанию чистого кода для сокетов.
ZeroMQ определенно не единственная библиотека, отвечающая за передачу сообщений, кото-