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

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

Передачи

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

Кредит связи во времени: получатель его выдаёт, отправитель расходует, а клиент выдаёт новое окно, когда урегулирована половинаПолучатель: сервисОтправитель: брокерflowlink-credit 256передачив пределах кредитадиспозициидля 128 доставокflowснова link-credit 256передачипродолжаютсяКредит считает передачи от последнего flow:доставка, которую сервис ещё держит, его не возвращает
Схема текстом
  1. Получатель: сервис: flow link-credit 256; диспозиции для 128 доставок; flow снова link-credit 256
  2. Отправитель: брокер: передачи в пределах кредита; передачи продолжаются
  3. flow link-credit 256 → передачи в пределах кредита: flow
  4. передачи в пределах кредита → диспозиции для 128 доставок: transfer
  5. диспозиции для 128 доставок → flow снова link-credit 256: половина урегулирована
  6. flow снова link-credit 256 → передачи продолжаются: flow
  7. Кредит считает передачи от последнего flow: доставка, которую сервис ещё держит, его не возвращает

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

Кредитом управляет сам клиент fe2o3-amqp. Каждый раз, когда урегулирована половина кредита, он снова выдаёт полный кредит, отсчитанный от уже принятых передач. Поэтому у отправителя не кончается кредит, пока сервис работает, и он никогда не уходит вперёд больше чем на одно окно от последней выдачи.

Четыре исхода диспозиции и то, в каком состоянии каждый оставляет сообщение на брокереДиспозицияБрокерacceptedготово: сообщениеуходит из очередиrejectedнедопустимо: решает политиканедоставленных сообщенийreleasedне обработано: обратнов очередь, счёт прежнийmodifieddelivery-failedошибка: обратно вочередь, delivery-count + 1Режимы отправителя: unsettled, settled, mixed (по умолчанию);уже урегулированная передача доставляется at-most-once
Схема текстом
  1. Диспозиция: accepted; rejected; released; modified delivery-failed
  2. Брокер: готово: сообщение уходит из очереди; недопустимо: решает политика недоставленных сообщений; не обработано: обратно в очередь, счёт прежний; ошибка: обратно в очередь, delivery-count + 1
  3. accepted → готово: сообщение уходит из очереди
  4. rejected → недопустимо: решает политика недоставленных сообщений
  5. released → не обработано: обратно в очередь, счёт прежний
  6. modified delivery-failed → ошибка: обратно в очередь, delivery-count + 1
  7. Режимы отправителя: 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).