Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Передачи
Отправитель передаёт сообщение только в счёт кредита связи получателя, а получатель урегулирует каждую передачу диспозицией с её исходом.
Схема текстом
- Получатель: сервис: flow link-credit 256; диспозиции для 128 доставок; flow снова link-credit 256
- Отправитель: брокер: передачи в пределах кредита; передачи продолжаются
- flow link-credit 256 → передачи в пределах кредита: flow
- передачи в пределах кредита → диспозиции для 128 доставок: transfer
- диспозиции для 128 доставок → flow снова link-credit 256: половина урегулирована
- flow снова link-credit 256 → передачи продолжаются: flow
- Кредит считает передачи от последнего flow: доставка, которую сервис ещё держит, его не возвращает
Кредит - это способ, которым получатель управляет потоком. Получатель отправляет кадр flow с
кредитом, и отправитель может выполнить столько передач, прежде чем ждать следующего кадра. По
умолчанию подписка выдаёт кредит 256, а credit
задаёт другое число.
Кредитом управляет сам клиент fe2o3-amqp. Каждый раз, когда урегулирована половина кредита, он
снова выдаёт полный кредит, отсчитанный от уже принятых передач. Поэтому у отправителя не
кончается кредит, пока сервис работает, и он никогда не уходит вперёд больше чем на одно окно от
последней выдачи.
Схема текстом
- Диспозиция: accepted; rejected; released; modified delivery-failed
- Брокер: готово: сообщение уходит из очереди; недопустимо: решает политика недоставленных сообщений; не обработано: обратно в очередь, счёт прежний; ошибка: обратно в очередь, delivery-count + 1
- accepted → готово: сообщение уходит из очереди
- rejected → недопустимо: решает политика недоставленных сообщений
- released → не обработано: обратно в очередь, счёт прежний
- modified delivery-failed → ошибка: обратно в очередь, delivery-count + 1
- Режимы отправителя: unsettled, settled, mixed (по умолчанию); уже урегулированная передача доставляется at-most-once
Передача, которую отправитель не урегулировал, остаётся открытой, пока получатель не ответит
диспозицией. Её исход - один из четырёх. accepted завершает сообщение. rejected объявляет его
недопустимым, и что с ним будет, решает политика недоставленных сообщений брокера. released
возвращает его нетронутым, и следующая доставка приходит с тем же delivery-count. modified с
delivery-failed возвращает его как неудачную попытку, и следующая доставка считает на одну
больше. undeliverable-here в modified просит брокер больше не доставлять сообщение этому
получателю.
delivery-count хранится в секции header сообщения и считает предыдущие неудачные попытки.
Брокеры по-разному обращаются с modified: Artemis его учитывает, RabbitMQ 4 поддерживает его
только на кворумных очередях, а Azure Service Bus его не использует.
Управление потоком и режимы урегулирования взяты из спецификации (транспорт, разделы 2.6.7 и 2.8), как и исходы (обмен сообщениями, раздел 3.4).