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

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

Завершение

Чем ack, retry, retry_after и drop становятся в Pub/Sub, который подтверждает, отклоняет или продолжает держать в аренде каждое сообщение.

Каждый исход обработчика и вызов, который крейт делает для него в Pub/SubОбработчикВ Pub/Suback()Подтверждено:удалено из подпискиretry()nack: доставка снова послепаузы повторной попыткиили перенос в dead-letterretry_after(d)Удерживается d, покаклиент продлевает аренду,затем nack; отказ, еслиd больше max_leasedrop()Подтверждено:больше не доставляетсяdrop() напоследней попыткеnack, и Pub/Subпереносит егов тему dead-letterНа подписке exactly-once ack и nackждут подтверждения от Pub/Sub
Схема текстом
  1. Обработчик: ack(); retry(); retry_after(d); drop(); drop() на последней попытке
  2. В Pub/Sub: Подтверждено: удалено из подписки; nack: доставка снова после паузы повторной попытки или перенос в dead-letter; Удерживается d, пока клиент продлевает аренду, затем nack; отказ, если d больше max_lease; Подтверждено: больше не доставляется; nack, и Pub/Sub переносит его в тему dead-letter
  3. ack() → Подтверждено: удалено из подписки
  4. retry() → nack: доставка снова после паузы повторной попытки или перенос в dead-letter
  5. retry_after(d) → Удерживается d, пока клиент продлевает аренду, затем nack; отказ, если d больше max_lease
  6. drop() → Подтверждено: больше не доставляется
  7. drop() на последней попытке → nack, и Pub/Sub переносит его в тему dead-letter
  8. На подписке exactly-once ack и nack ждут подтверждения от Pub/Sub

Кроме ack, у Pub/Sub нет способа сказать «отбросить без повторной доставки», поэтому drop() подтверждает сообщение. Исключение - последняя доставка, которую допускает политика dead-letter подписки. Там сообщение в тему dead-letter переносит именно nack, поэтому drop() отправляет nack. Крейт берёт номер попытки из доставки. Предел он берёт из max_attempts(n) регистрации. Если политику задал оператор вне кода, предел читается из самой подписки, один раз при запуске. Для этого нужно право pubsub.subscriptions.get. Без него сервис пишет предупреждение, и drop() подтверждает сообщение. Счётчик попыток приблизителен, поэтому при сброшенном счётчике drop() тоже подтверждает сообщение.

Ошибка декодирования по умолчанию отбрасывает сообщение (FailurePolicy), поэтому в Pub/Sub оно подтверждается.

Подписка сама считает попытки и сама переносит исчерпавшие их сообщения. retry() при объявленном max_attempts - такой же nack, как любой другой, и предел применяет Pub/Sub. Копию для переобработки рантайм на этом брокере не публикует.

retry_after(d) оставляет доставку в процессе. Задача на рантайме, на котором подключился брокер, ждёт d, а затем отправляет nack. Тем временем клиент продолжает продлевать аренду, и сообщение учитывается в max_outstanding. d дольше max_lease отклоняется прямо в вызове с ошибкой PubSubError::DelayBeyondLease, потому что аренда закончилась бы раньше. Если процесс падает во время ожидания, аренда заканчивается, и Pub/Sub доставляет сообщение снова: теряется задержка, но не сообщение.

На подписке exactly-once крейт использует подтверждаемые ack и nack клиента. ack, который вернул управление, принят Pub/Sub, а отклонённый записывается в журнал как неудачный ack. На любой другой подписке ack выполняется без гарантий, и сообщение всё ещё может вернуться.