Перейти к основному содержимому
Нормативная версия документации - английская

Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.

Сокеты

ZeroMQ - библиотека сокетов, которые обмениваются сообщениями напрямую: без сервера и без хранения, а кто получит каждое сообщение, решает паттерн.

Три паттерна сокетов: конвейер, рассылка с фильтром по префиксу и запросы, различаемые по соединению, без сервера между узламиPUSH/PULL: конвейерPUB/SUB: рассылкаDEALER/ROUTER: запрос и ответВентилятор: PUSHслушаетВоркер 1: PULLподключаетсяполучает 1 и 4Воркер 2: PULLподключаетсяполучает 2Воркер 3: PULLподключаетсяполучает 3Приёмник PULL, слушаетчитает их по очередиИздатель PUB, слушаетсверяет фильтрыSUBподключаетсяфильтр jobs.SUBподключаетсяфильтр pricesorders.new:нет фильтра,отброшеноОтвечающий ROUTER, слушаетидентичность на соединениеЗапросы: DEALERподключаетсяЗапросы: DEALERподключается
Схема текстом
  1. PUSH/PULL: конвейер: Вентилятор: PUSH слушает; Воркер 1: PULL подключается получает 1 и 4; Воркер 2: PULL подключается получает 2; Воркер 3: PULL подключается получает 3; Приёмник PULL, слушает читает их по очереди
  2. PUB/SUB: рассылка: Издатель PUB, слушает сверяет фильтры; SUB подключается фильтр jobs.; SUB подключается фильтр prices; orders.new: нет фильтра, отброшено
  3. DEALER/ROUTER: запрос и ответ: Отвечающий ROUTER, слушает идентичность на соединение; Запросы: DEALER подключается; Запросы: DEALER подключается
  4. Вентилятор: PUSH слушает → Воркер 1: PULL подключается получает 1 и 4: по очереди
  5. Вентилятор: PUSH слушает → Воркер 2: PULL подключается получает 2
  6. Вентилятор: PUSH слушает → Воркер 3: PULL подключается получает 3
  7. Воркер 1: PULL подключается получает 1 и 4 → Приёмник PULL, слушает читает их по очереди
  8. Воркер 2: PULL подключается получает 2 → Приёмник PULL, слушает читает их по очереди
  9. Воркер 3: PULL подключается получает 3 → Приёмник PULL, слушает читает их по очереди
  10. Издатель PUB, слушает сверяет фильтры → SUB подключается фильтр jobs.: jobs.done
  11. Издатель PUB, слушает сверяет фильтры → SUB подключается фильтр prices: prices.eur
  12. Издатель PUB, слушает сверяет фильтры → orders.new: нет фильтра, отброшено
  13. Запросы: DEALER подключается → Отвечающий ROUTER, слушает идентичность на соединение: идентичность A
  14. Запросы: DEALER подключается → Отвечающий ROUTER, слушает идентичность на соединение: идентичность B

Каждый блок на схеме - сокет в каком-то процессе. Сообщение идёт от одного сокета к другому по соединению между ними. После этого его никто не хранит, поэтому сокет, который в этот момент не подключён, его не увидит.

Какая сторона слушает, а какая подключается, не зависит от того, в какую сторону идут сообщения. Устойчивая часть топологии привязывается к адресу, а части, которые появляются и исчезают, подключаются к ней. В конвейере вентилятор и приёмник привязываются, а воркеры подключаются к обоим. ZmqEndpoint задаёт сторону, которую занимает этот сервис.

Сокет PUSH раздаёт сообщения подключённым узлам по очереди: одно сообщение одному узлу. Сокет PULL читает от всех своих узлов по очереди, поэтому ни один узел не оттесняет остальные. Это ZmqQueue.

Сокет SUB отправляет свои фильтры тому PUB, к которому подключён. PUB сравнивает первый кадр каждого сообщения с каждым фильтром по префиксу и отправляет сообщение только туда, где фильтр совпал. Сообщение, которому не подошёл ни один фильтр, отбрасывается, и издатель об этом не узнаёт. Это ZmqFanout, где имя подписки служит её фильтром.

Сокет ROUTER даёт каждому соединению идентичность. Он ставит идентичность перед каждым полученным сообщением и отправляет сообщение тому соединению, идентичность которого стоит в первом кадре. DEALER отправляет и принимает сообщения без кадра идентичности. Это ZmqRpc, а страница Кадры показывает конверт.

У сокета может быть много узлов, а порядок сохраняется только между двумя сокетами одной пары. ruststream-zeromq работает на tcp:// и ipc://. Другую схему адреса брокер отвергает при подключении, до того как откроется хоть один сокет.

Это паттерны самого ZeroMQ (конвейер, публикация-подписка, запрос-ответ), а zguide объясняет, какая сторона привязывается.