Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Путь
Путь одной доставки RabbitMQ через сервис RustStream: передача потребителю, обработчик, ответ и подтверждение.
Схема текстом
- Очередь передаёт в окне предвыборки → basic.deliver в собственном канале подписки
- basic.deliver в собственном канале подписки → LapinMessage тело без копии, заголовки сразу
- LapinMessage тело без копии, заголовки сразу → Диспетчеризация один цикл или партиция по ключу
- Диспетчеризация один цикл или партиция по ключу → Декодирование кодек читает тело
- Декодирование кодек читает тело → Обработчик подписчика async fn под #[subscriber]
- Обработчик подписчика async fn под #[subscriber] → Ответ кодируется в буфер цикла
- Ответ кодируется в буфер цикла → LapinPublisher basic.publish ответа
- 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 без фреймворка, показывает страница Бенчмарки.