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

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

Путь

Путь одной доставки RabbitMQ через сервис RustStream: передача потребителю, обработчик, ответ и подтверждение.

Путь одной доставки RabbitMQ, на которую отвечают: от очереди до её подтвержденияОчередьпередаёт в окне предвыборкиbasic.deliverв собственном канале подпискиLapinMessageтело без копии, заголовки сразуДиспетчеризацияодин цикл или партиция по ключуДекодированиекодек читает телоОбработчик подписчикаasync fn под #[subscriber]Ответкодируется в буфер циклаLapinPublisherbasic.publish ответаПодтверждениеbasic.ack или basic.reject
Схема текстом
  1. Очередь передаёт в окне предвыборки → basic.deliver в собственном канале подписки
  2. basic.deliver в собственном канале подписки → LapinMessage тело без копии, заголовки сразу
  3. LapinMessage тело без копии, заголовки сразу → Диспетчеризация один цикл или партиция по ключу
  4. Диспетчеризация один цикл или партиция по ключу → Декодирование кодек читает тело
  5. Декодирование кодек читает тело → Обработчик подписчика async fn под #[subscriber]
  6. Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер цикла
  7. Ответ кодируется в буфер цикла → LapinPublisher basic.publish ответа
  8. LapinPublisher basic.publish ответа → Подтверждение basic.ack или basic.reject

Очередь передаёт доставку потребителю подписки, пока в его окне предвыборки есть место. lapin отдаёт её вместе с телом в собственном буфере. LapinMessage хранит этот буфер как тело, без копирования. Заголовки она читает при получении доставки: строковые и байтовые записи таблицы заголовков, а также собственные свойства AMQP, которые обработчик читает как заголовки (content-type, correlation-id, reply-to, message-id, приоритет и срок действия). Обменник, ключ маршрутизации, флаг redelivered и тег доставки хранятся рядом с ними как контекст доставки.

Рантайм забирает доставку из потока подписки и выполняет её в своём цикле диспетчеризации. Кодек декодирует тело, и выполняется обработчик.

Ответ кодируется в буфер, который цикл диспетчеризации использует повторно. Издатель одалживает эти байты lapin, а lapin копирует их в отправляемый кадр. Четыре заголовка идентификации передаются в собственных свойствах AMQP, поэтому потребитель, который не является сервисом RustStream, находит их там, где их размещает AMQP. Все остальные заголовки попадают в таблицу заголовков байтовыми строками. Ключ маршрутизации - это адрес ответа, а обменник задаёт политика публикации: обменник по умолчанию, если политика не называет другой.

Доставка подтверждается после ответа, в том же канале, через который она пришла. ack отправляет basic.ack. retry() и drop отправляют basic.reject с requeue и без него. Если ответ не удалось опубликовать, доставка завершается как переобработка. Во что превращается каждый исход, показывает страница Подтверждение.

Сколько этот путь стоит на одно сообщение по сравнению с клиентом lapin без фреймворка, показывает страница Бенчмарки.