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

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

Путь

Путь одного сообщения ZeroMQ через сервис RustStream: задача сокета, канал, обработчик, кадры ответа и отправка.

Путь одного сообщения ZeroMQ, на которое отвечают: от кадров узла до кадров ответаУзелотправляет три кадраЗадача сокетавладеет сокетом, читает одно сообщениеZmqMessageимя, заголовки и кадр нагрузкиКаналглубиной read_aheadДиспетчеризацияпо одному или пакетомДекодированиена месте, из кадра нагрузкиОбработчик подписчикаasync fn под #[subscriber]Ответкодируется в буфер для издателяКадрыбуфер становится кадром нагрузкиИздательповторяет, пока узел не подключитсяЗавершениеack отвечает Unsupported
Схема текстом
  1. Узел отправляет три кадра → Задача сокета владеет сокетом, читает одно сообщение
  2. Задача сокета владеет сокетом, читает одно сообщение → ZmqMessage имя, заголовки и кадр нагрузки
  3. ZmqMessage имя, заголовки и кадр нагрузки → Канал глубиной read_ahead
  4. Канал глубиной read_ahead → Диспетчеризация по одному или пакетом
  5. Диспетчеризация по одному или пакетом → Декодирование на месте, из кадра нагрузки
  6. Декодирование на месте, из кадра нагрузки → Обработчик подписчика async fn под #[subscriber]
  7. Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер для издателя
  8. Ответ кодируется в буфер для издателя → Кадры буфер становится кадром нагрузки
  9. Кадры буфер становится кадром нагрузки → Издатель повторяет, пока узел не подключится
  10. Издатель повторяет, пока узел не подключится → Завершение ack отвечает Unsupported

Задача, которая владеет сокетом подписки, принимает по одному сообщению. Она разбирает кадры на имя, заголовки и полезную нагрузку. Полезная нагрузка - это сам полученный кадр, а не его копия, и вход обработчика декодируется из него на месте.

Сообщение попадает в канал подписки глубиной read_ahead, и оттуда его забирает цикл диспетчеризации. Обработчик пакетов получает сообщения, которые уже лежат в канале, вплоть до размера, заданного в точке монтирования, или то, что пришло в течение 20 миллисекунд после первого.

Ответ обработчика кодируется в буфер, который забирает издатель. Буфер становится кадром полезной нагрузки, а имя и заголовки идут перед ним отдельными кадрами, поэтому полезная нагрузка не копируется. Издатель, который привязывается к адресу, подключил свой сокет при старте, а издатель, который подключается сам, подключает его при первой публикации. Отправка в очередь, которая ещё не нашла подключённого узла, повторяется каждые 50 миллисекунд до пяти секунд, а затем возвращает ошибку, в которой назван адресат.

Доставка завершается после ответа. В ZeroMQ завершать нечего, поэтому ack сразу отвечает Unsupported, как показывает страница Завершение. Во что сообщение обходится на этом пути в инструкциях и выделениях памяти, показывает страница Бенчмарки.