Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Сокеты
ZeroMQ - библиотека сокетов, которые обмениваются сообщениями напрямую: без сервера и без хранения, а кто получит каждое сообщение, решает паттерн.
Схема текстом
- PUSH/PULL: конвейер: Вентилятор: PUSH слушает; Воркер 1: PULL подключается получает 1 и 4; Воркер 2: PULL подключается получает 2; Воркер 3: PULL подключается получает 3; Приёмник PULL, слушает читает их по очереди
- PUB/SUB: рассылка: Издатель PUB, слушает сверяет фильтры; SUB подключается фильтр jobs.; SUB подключается фильтр prices; orders.new: нет фильтра, отброшено
- DEALER/ROUTER: запрос и ответ: Отвечающий ROUTER, слушает идентичность на соединение; Запросы: DEALER подключается; Запросы: DEALER подключается
- Вентилятор: PUSH слушает → Воркер 1: PULL подключается получает 1 и 4: по очереди
- Вентилятор: PUSH слушает → Воркер 2: PULL подключается получает 2
- Вентилятор: PUSH слушает → Воркер 3: PULL подключается получает 3
- Воркер 1: PULL подключается получает 1 и 4 → Приёмник PULL, слушает читает их по очереди
- Воркер 2: PULL подключается получает 2 → Приёмник PULL, слушает читает их по очереди
- Воркер 3: PULL подключается получает 3 → Приёмник PULL, слушает читает их по очереди
- Издатель PUB, слушает сверяет фильтры → SUB подключается фильтр jobs.: jobs.done
- Издатель PUB, слушает сверяет фильтры → SUB подключается фильтр prices: prices.eur
- Издатель PUB, слушает сверяет фильтры → orders.new: нет фильтра, отброшено
- Запросы: DEALER подключается → Отвечающий ROUTER, слушает идентичность на соединение: идентичность A
- Запросы: DEALER подключается → Отвечающий ROUTER, слушает идентичность на соединение: идентичность B
Каждый блок на схеме - сокет в каком-то процессе. Сообщение идёт от одного сокета к другому по соединению между ними. После этого его никто не хранит, поэтому сокет, который в этот момент не подключён, его не увидит.
Какая сторона слушает, а какая подключается, не зависит от того, в какую сторону идут сообщения.
Устойчивая часть топологии привязывается к адресу, а части, которые появляются и исчезают,
подключаются к ней. В конвейере вентилятор и приёмник привязываются, а воркеры подключаются к
обоим. ZmqEndpoint задаёт сторону, которую
занимает этот сервис.
Сокет PUSH раздаёт сообщения подключённым узлам по очереди: одно сообщение одному узлу. Сокет PULL
читает от всех своих узлов по очереди, поэтому ни один узел не оттесняет остальные. Это
ZmqQueue.
Сокет SUB отправляет свои фильтры тому PUB, к которому подключён. PUB сравнивает первый кадр
каждого сообщения с каждым фильтром по префиксу и отправляет сообщение только туда, где фильтр
совпал. Сообщение, которому не подошёл ни один фильтр, отбрасывается, и издатель об этом не
узнаёт. Это ZmqFanout, где имя подписки служит её
фильтром.
Сокет ROUTER даёт каждому соединению идентичность. Он ставит идентичность перед каждым полученным
сообщением и отправляет сообщение тому соединению, идентичность которого стоит в первом кадре.
DEALER отправляет и принимает сообщения без кадра идентичности. Это
ZmqRpc, а страница Кадры показывает конверт.
У сокета может быть много узлов, а порядок сохраняется только между двумя сокетами одной пары.
ruststream-zeromq работает на tcp:// и ipc://. Другую схему адреса брокер отвергает при
подключении, до того как откроется хоть один сокет.
Это паттерны самого ZeroMQ (конвейер, публикация-подписка, запрос-ответ), а zguide объясняет, какая сторона привязывается.