Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Завершение
Чем ack, retry, retry_after
и drop становятся в Pub/Sub, который подтверждает, отклоняет или продолжает держать в аренде
каждое сообщение.
Схема текстом
- Обработчик: ack(); retry(); retry_after(d); drop(); drop() на последней попытке
- В Pub/Sub: Подтверждено: удалено из подписки; nack: доставка снова после паузы повторной попытки или перенос в dead-letter; Удерживается d, пока клиент продлевает аренду, затем nack; отказ, если d больше max_lease; Подтверждено: больше не доставляется; nack, и Pub/Sub переносит его в тему dead-letter
- ack() → Подтверждено: удалено из подписки
- retry() → nack: доставка снова после паузы повторной попытки или перенос в dead-letter
- retry_after(d) → Удерживается d, пока клиент продлевает аренду, затем nack; отказ, если d больше max_lease
- drop() → Подтверждено: больше не доставляется
- drop() на последней попытке → nack, и Pub/Sub переносит его в тему dead-letter
- На подписке 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 выполняется без гарантий, и сообщение всё ещё может вернуться.