Google Pub / Sub + Cloud Run порождает несколько контейнеров - PullRequest
0 голосов
/ 02 марта 2020

Я ищу помощь! Я работаю над небольшим проектом, который включает публикацию сообщения в Google Pub / Sub Topi c и использование подписки 'pu sh' для запуска службы Cloud Run HTTPS. У меня проблема в том, что крайний срок Ack для подписки 'pu sh', похоже, не соблюдается. Я вижу, что одно и то же сообщение порождает несколько контейнеров в службе Cloud Run, хотя крайний срок Ack или время ожидания запроса не были достигнуты при первом запуске. Я хочу, чтобы только 1 сообщение порождало 1 контейнер до завершения (возврат 200 OK).

Текущий поток (выпуск):

  1. Сообщение опубликовано в pubsub topi c
  2. Подписка 'pu sh' (с 600-секундным крайним сроком подтверждения) перенаправляет сообщение в конечную точку службы HTTPS в Cloud Run (с тайм-аутом 600-секундного запроса)
  3. Служба Cloud Run начинает обработку этого сообщение, эта работа занимает 120 секунд
  4. Во время обработки то же сообщение повторно запускает новый контейнер службы Cloud Run (каждые 10 секунд до завершения первого контейнера), порождая несколько контейнеров для одного и того же сообщения.
  5. После завершения первого контейнера Cloud Run новые контейнеры Cloud Run не запускаются, и сообщение перестает получать каждые 10 секунд.

Снимок экрана

Ожидаемый поток (Что я хочу):

  1. Сообщение публикуется в pubsub topi c
  2. A 'pu sh' подписка (с 600-секундным сроком подтверждения Ack) пересылает сообщение в конечную точку службы Cloud Run HTTPS (с тайм-аутом запроса 600 секунд)
  3. Служба Cloud Run обрабатывает это сообщение в течение 120 секунд только с одним контейнером. Любые НОВЫЕ сообщения должны запускаться в отдельном контейнере.
  4. Служба Cloud Run завершает обработку в течение 600-секундного крайнего срока Ack и не порождает новые контейнеры для того же сообщения.

Описание подписки :

gcloud pubsub subscriptions describe myBuildSubscription
ackDeadlineSeconds: 600
expirationPolicy: {}
messageRetentionDuration: 87000s
name: projects/myproject-12345/subscriptions/myBuildSubscription
pushConfig:
  oidcToken:
    serviceAccountEmail: cloud-run-pubsub-invoker@myproject-12345.iam.gserviceaccount.com
  pushEndpoint: https://my-project-example-ue.a.run.app
topic: projects/myproject-12345/topics/my_build_queue

Дополнительная информация: Я работаю на основе этого урока: https://cloud.google.com/run/docs/tutorials/pubsub

Я добавил функцию сна в Код учебника Pub / Sub для имитации 120 секунд работы:

https://github.com/cvasq/golang-samples/commit/fa2286d4395d31b5eca12d73dd24187042211124

Текущее решение: Установите максимальное количество количество контейнеров и максимальное количество запросов на контейнер к 1. Это позволяет обрабатывать только 1 сообщение от topi c за один раз.

Может кто-нибудь дать некоторые указания относительно того, почему это может происходить? Конфиг кажется правильным, но я могу что-то упустить.

1 Ответ

1 голос
/ 03 марта 2020

Мне удалось решить мою проблему, заново создав подписку pubsub и службу облачного запуска в командной строке с желаемым сроком и конфигурацией параллелизма.

При первом создании подписки и запуска в облаке сервис в командной строке, а затем изменил крайний срок подтверждения в пользовательском интерфейсе Google Cloud. Я подозреваю, что изменение по какой-то причине не произошло в бэкэнде Google Cloud.

gcloud pubsub subscriptions create mySubscription --topic projects/myproject-123456/topics/build_queue --push-endpoint=https://myservice-ue.a.run.app --push-auth-service-account=cloud-run-pubsub-invoker@myproject-123456.iam.gserviceaccount.com --ack-deadline 600


gcloud run deploy --memory 2Gi site-build --image gcr.io/myproject-123456/site-builder --concurrency 1 --max-instances 10
...