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

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

Аренда

Streaming pull берёт каждое сообщение в аренду: клиент продлевает его срок подтверждения, пока работает обработчик, а управление потоком ограничивает, сколько сообщений клиент держит.

Streaming pull: сообщения приходят в аренду, которую клиент продлевает, пока приложение их держит, а ack уходят пакетамиgoogle-cloud-pubsubПриложениеПодписка Pub/Subу каждого сообщения свой срок подтвержденияStreaming pullдо max_outstandingНабор арендпроверка каждые 3 сack и nackуходятпакетамираз в 100 мсОбработчикдержит сообщениеЗавершает его:ack или nackПосле max_lease клиент перестаёт продлевать срок:он истекает, и сообщение возвращается
Схема текстом
  1. google-cloud-pubsub: Streaming pull до max_outstanding; Набор аренд проверка каждые 3 с; ack и nack уходят пакетами раз в 100 мс
  2. Приложение: Обработчик держит сообщение; Завершает его: ack или nack
  3. Подписка Pub/Sub у каждого сообщения свой срок подтверждения → Streaming pull до max_outstanding: сообщения
  4. Streaming pull до max_outstanding → Набор аренд проверка каждые 3 с
  5. Набор аренд проверка каждые 3 с → Обработчик держит сообщение
  6. Обработчик держит сообщение → Завершает его: ack или nack
  7. Набор аренд проверка каждые 3 с → Подписка Pub/Sub у каждого сообщения свой срок подтверждения: продлевает
  8. Завершает его: ack или nack → ack и nack уходят пакетами раз в 100 мс: завершено
  9. ack и nack уходят пакетами раз в 100 мс → Подписка Pub/Sub у каждого сообщения свой срок подтверждения: ack, nack
  10. После 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 (управление арендой).