Эта страница переведена с английского языковой моделью. При любом расхождении верен английский оригинал.
Аренда
Streaming pull берёт каждое сообщение в аренду: клиент продлевает его срок подтверждения, пока работает обработчик, а управление потоком ограничивает, сколько сообщений клиент держит.
Схема текстом
- google-cloud-pubsub: Streaming pull до max_outstanding; Набор аренд проверка каждые 3 с; ack и nack уходят пакетами раз в 100 мс
- Приложение: Обработчик держит сообщение; Завершает его: ack или nack
- Подписка Pub/Sub у каждого сообщения свой срок подтверждения → Streaming pull до max_outstanding: сообщения
- Streaming pull до max_outstanding → Набор аренд проверка каждые 3 с
- Набор аренд проверка каждые 3 с → Обработчик держит сообщение
- Обработчик держит сообщение → Завершает его: ack или nack
- Набор аренд проверка каждые 3 с → Подписка Pub/Sub у каждого сообщения свой срок подтверждения: продлевает
- Завершает его: ack или nack → ack и nack уходят пакетами раз в 100 мс: завершено
- ack и nack уходят пакетами раз в 100 мс → Подписка Pub/Sub у каждого сообщения свой срок подтверждения: ack, nack
- После max_lease клиент перестаёт продлевать срок: он истекает, и сообщение возвращается
Streaming pull - это один долгоживущий поток gRPC на подписку. Pub/Sub отправляет по нему сообщения по мере их поступления, и у каждого есть срок подтверждения. Сообщение, которое до истечения срока не подтвердили и срок которого не продлили, доставляется снова, возможно другому подписчику.
Клиентская библиотека отодвигает этот срок. Для каждого сообщения, которое приложение ещё держит,
она отправляет modifyAckDeadline и переносит срок не дальше чем на
ack_extension вперёд (по умолчанию
60 секунд, значение ограничено пределами от 10 до 600). Так она поступает не дольше
max_lease, по умолчанию один час. Процесс,
который упал, ничего не продлевает, поэтому его сообщения возвращаются в подписку, как только
истекут их сроки.
Управление потоком работает на уровне потока gRPC. Pub/Sub перестаёт отправлять, пока в потоке
остаются незавершёнными
max_outstanding
сообщений (по умолчанию 1000) или 100 МиБ, и продолжает, когда их число падает ниже предела.
Поэтому медленный обработчик замедляет собственный поток, а сообщения, которые он ещё не получил,
ждут в подписке.
ack удаляет сообщение из подписки. nack - это modifyAckDeadline с нулевым сроком: сообщение
покидает набор аренд, и Pub/Sub доставляет его снова, как показывает страница
Повторная доставка.
Числа взяты из клиента google-cloud-pubsub 1.3
(Subscribe)
и у Google (управление арендой).