Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Путь
Путь одного сообщения ZeroMQ через сервис RustStream: задача сокета, канал, обработчик, кадры ответа и отправка.
Схема текстом
- Узел отправляет три кадра → Задача сокета владеет сокетом, читает одно сообщение
- Задача сокета владеет сокетом, читает одно сообщение → ZmqMessage имя, заголовки и кадр нагрузки
- ZmqMessage имя, заголовки и кадр нагрузки → Канал глубиной read_ahead
- Канал глубиной read_ahead → Диспетчеризация по одному или пакетом
- Диспетчеризация по одному или пакетом → Декодирование на месте, из кадра нагрузки
- Декодирование на месте, из кадра нагрузки → Обработчик подписчика async fn под #[subscriber]
- Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер для издателя
- Ответ кодируется в буфер для издателя → Кадры буфер становится кадром нагрузки
- Кадры буфер становится кадром нагрузки → Издатель повторяет, пока узел не подключится
- Издатель повторяет, пока узел не подключится → Завершение ack отвечает Unsupported
Задача, которая владеет сокетом подписки, принимает по одному сообщению. Она разбирает кадры на имя, заголовки и полезную нагрузку. Полезная нагрузка - это сам полученный кадр, а не его копия, и вход обработчика декодируется из него на месте.
Сообщение попадает в канал подписки глубиной
read_ahead, и оттуда его забирает цикл диспетчеризации.
Обработчик пакетов получает сообщения, которые уже лежат
в канале, вплоть до размера, заданного в точке монтирования, или то, что пришло в течение 20
миллисекунд после первого.
Ответ обработчика кодируется в буфер, который забирает издатель. Буфер становится кадром полезной нагрузки, а имя и заголовки идут перед ним отдельными кадрами, поэтому полезная нагрузка не копируется. Издатель, который привязывается к адресу, подключил свой сокет при старте, а издатель, который подключается сам, подключает его при первой публикации. Отправка в очередь, которая ещё не нашла подключённого узла, повторяется каждые 50 миллисекунд до пяти секунд, а затем возвращает ошибку, в которой назван адресат.
Доставка завершается после ответа. В ZeroMQ завершать нечего, поэтому ack сразу отвечает
Unsupported, как показывает страница Завершение. Во что сообщение обходится на
этом пути в инструкциях и выделениях памяти, показывает страница
Бенчмарки.