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 никогда не выполняется;или конечная точка нажатия никогда не отвечает или отвечает с ошибкой.