Облачный паб / подписчик повторяет сообщения более 600 мс - PullRequest
0 голосов
/ 25 февраля 2019

Мы недавно интегрировали google pubsub в наше приложение, и некоторые из наших долгосрочных задач теперь находятся под проблемой, поскольку иногда они занимают более 1 минуты.Мы настроили крайний срок подтверждения нашего подписчика на 600 секунд, но все, что занимает больше, чем 600ms, повторяется pubsub.

это наша конфигурация:

gcloud pubsub subscriptions describe name

ackDeadlineSeconds: 600
expirationPolicy: {}
messageRetentionDuration: 604800s

Не уверен, в чем проблема.Большинство наших задач будут повторяться из-за этого

1 Ответ

0 голосов
/ 25 февраля 2019

Pub / Sub имеет встроенную По крайней мере один раз систему доставки, которая будет повторять сообщения, которые не были подтверждены.В этом случае по истечении 600 секунд сообщение, которое вы впервые отправили, становится неподтвержденным, поэтому Pub / Sub повторяет сообщение.Он будет повторять попытки в течение 600 секунд, пока не достигнет messageRetentionDuration или пока вы его не подтвердите.

Имейте в виду, что в документации указано, что ваш подписчик должен быть идемпотентом.Таким образом, обеспечение того, чтобы ваш код мог обрабатывать несколько сообщений, должно быть лучшим подходом к этой проблеме.

Вы также можете уменьшить messageRetentionDuration до 600s (это минимум), чтобы все, что прошло 10-минутную отметку, не повторялось.

Кроме того, это указано в Часто задаваемые вопросы что:

Почему слишком много дублирующихся сообщений?

Cloud Pub / Sub гарантирует доставку сообщений хотя бы один раз, чтоозначает, что случайные дубликаты следует ожидать.Однако высокая частота дубликатов может указывать на то, что клиент не подтверждает сообщения в сконфигурированном ack_deadline_seconds, и Cloud Pub / Sub пытается повторить доставку сообщения.Это можно наблюдать в метриках мониторинга .pubsub.googleapis.com/subscription/pull_ack_message_operation_count для push-подписок и pubsub.googleapis.com/subscription/push_request_count для push-подписок.Ищите повышенные значения с истекшим или webhook_timeout в /response_code.Это особенно вероятно, если имеется много небольших сообщений, поскольку Cloud Pub / Sub может пакетировать сообщения внутри и частично подтвержденная партия будет полностью доставлена.

Другая возможность состоит в том, что подписчик не подтверждает некоторые сообщения, поскольку кодобработка тракта этих конкретных сообщений не выполняется, и вызов Acknowledge никогда не выполняется;или конечная точка нажатия никогда не отвечает или отвечает с ошибкой.

...