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

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

Путь

Этапы, через которые проходит одна доставка от потока брокера до подтверждения, в том порядке, в каком их выполняет рантайм.

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

Подписка и издатель ответа определяются один раз, при старте приложения, по подключённому брокеру. На этом пути ничто не ищет подписку или издателя заново для каждого сообщения.

Слои приёма охватывают декодирование, поэтому слой видит доставку, даже если её содержимое не декодируется. Такое содержимое не доходит до обработчика: её судьбу решает политика отказов.

Обработчик без ответа подтверждает доставку сразу после своего тела. Обработчик, который вернул исход с ошибкой, ответ не публикует. Если ответ не удалось опубликовать, доставка уходит на повтор, и запрос не теряется.

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