У меня есть служба spring, подписывающаяся на сообщения из темы в pubsub облака google (вытягивание). В целом работает корректно. Но я хочу иметь больше контроля над недавними сообщениями. Моему сервису иногда нужно удалить сообщение или просто пропустить ackDeadline, чтобы я снова получил сообщение позже. При тестировании с одиночными сообщениями неподтвержденные сообщения возвращаются ко мне почти мгновенно, а те, которые я не подтверждаю или вообще не подтверждаю, возвращаются через 10 секунд по умолчанию для ackDeadline. Я хотел бы отложить повторное потребление этих сообщений. Я думал, что настройка повтора предназначена для таких случаев. Я также должен упомянуть, что в настоящее время я тестирую локально с помощью эмулятора и создаю подписку из кода. Я использую PubSubAdmin для управления.
В соответствии с этим документ я попытался установить эту конфигурацию в моей конфигурации профиля. нравится:
spring.cloud.gcp.pubsub.subscriber.retry.initial-retry-delay-second: 4
spring.cloud.gcp.pubsub.subscriber.retry.max-attempts: 5
spring.cloud.gcp.pubsub.subscriber.retry.initial-rpc-timeout-seconds: 4
spring.cloud.gcp.pubsub.subscriber.retry.max-rpc-timeout-seconds: 8
spring.cloud.gcp.pubsub.subscriber.retry.max-retry-delay-seconds: 7
spring.cloud.gcp.pubsub.subscriber.retry.total-timeout-seconds: 3000
но это не повлияло на время повторного появления сообщений. Я неправильно понимаю смысл повторных настроек? может быть, они вступают в силу только в том случае, если есть какие-то проблемы с подключением, но не в случаях взлома или отсутствия подтверждения? Или мне нужно установить параметр при использовании deployManager для создания подписок, и мне не разрешено устанавливать их из кода? Или, может быть, установка их в конфигурациях профиля (разработки) не будет работать с PubSubAdmin? Спасибо за любые предложения!
изменить: я хочу, чтобы первая повторная попытка произошла через 5 секунд, а следующая повторная попытка - через 10 секунд и т. д. Кроме того, я хочу установить максимальное число повторных попыток. Так что меня не интересует установка ackDeadline просто на большее число.
edit2: почему nacking: одна из служб (назовем это мостом) подписывается на сообщения, должна проверять каждое сообщение и, если все в порядке, передавать его другой внешней системе. эта служба действует как мост для этой системы, так как мы не можем работать со второй системой напрямую. в некоторых случаях сообщению нужна дополнительная информация, поэтому мост попытается получить ее где-то еще (включено много микросервисов), и иногда бывает, что в данный момент времени дополнительной информации там нет (пока). Итак, первая идея заключалась в том, чтобы не подтверждать сообщение и позволить ему прийти позже. но я не хочу спрашивать каждые 10 секунд в течение следующих 7 дней (с ackDeadline), я хочу просто попробовать несколько раз, и если его не будет через 2 часа, он никогда не придет. поэтому мы попытались отказаться и надеялись, что эти настройки повторной попытки помогут управлять повторной отправкой. Но поскольку они этого не делают, я полагаю, что единственный выход — создать что-то для управления этими сообщениями в мосте самостоятельно. Может быть, хранить идентификаторы сообщений и количество повторных попыток, чтобы я мог подтвердить, например, 5 раз и отправить сообщение в другую тему, чтобы по-другому с ним справиться. Или известны лучшие решения?
Вы можете использовать PubSubSubscriberTemplate.modifyAckDeadline(), чтобы программно продлить крайние сроки пакета сообщений, полученных по запросу. У каждого отдельного AcknowledgeablePubsubMessage также есть метод modifyAckDeadline(), если вам нужно продлить крайний срок только для нескольких избранных отставших.
Если все сообщения в этой конкретной подписке должны иметь более длительный период подтверждения, можно установить значение по умолчанию в консоли GCP, отредактировав подписку и обновив поле «Крайний срок подтверждения».
Параметры повтора предназначены для поведение gRPC; они не относятся к PubSub.
мой вопрос касается конкретных конфигураций pubsub и их значения для pubsub (см. вопрос выше и отредактируйте)
«может быть, они вступают в силу только в том случае, если есть какие-то проблемы с подключением, но не в случаях взлома или отсутствия подтверждения» - это правильно. Установка крайнего срока подтверждения — единственный способ контролировать, когда Pub/Sub будет повторно доставлять сообщения (документы).
Вас также может заинтересовать это обсуждение в клиентской библиотеке Pub/Sub Java.
Здравствуйте @Elena, вы упомянули gRPC, чтобы повторить настройки. Как это помогает нам практически? Также я хотел бы сослаться на эту страницу документа Google: ссылка на сайт, где показан объект JSON, используемый для настройки подписки, который включает элемент с пометкой «retryPolicy». Проблема для меня заключается в следующем: как предоставить такую конфигурацию объекту подписки, который я создаю с помощью SubscriptionAdminClient; в его API нет очевидного метода.
Ах, да, это сбивает с толку: повторная попытка gRPC — это низкоуровневая внутренняя деталь реализации, когда вызов gRPC по какой-то причине завершается сбоем. Повторная попытка Cloud Pub/Sub — это средство высокого уровня для повторной доставки неподтвержденных или просроченных сообщений. При вызове SubscriptionAdminClient.create() вы можете настроить политику повторных попыток Pub/Sub в прототипе Subscription — github.com/googleapis/java-pubsub/blob/….
Cloud Pub/Sub не обеспечивает экспоненциальную отсрочку для определенных сообщений. Отказ не имеет никакого эффекта, кроме как сообщить Cloud Pub/Sub, что вы не смогли обработать сообщение.
Я мог бы дать более полезный ответ, если бы вы задокументировали, почему вам нужно было удалить сообщения. Если вы не можете справиться с текущей нагрузкой, вы можете использовать параметры управления потоком, описанные здесь, чтобы уменьшить количество ожидающих сообщений или байтов для вашего клиента. Если у вас есть сообщения, о которых известно, что они плохие, вы должны вместо этого подтвердить их после отправки в другую тему недоставленных сообщений, которая будет обрабатываться отдельно.
Если у вас есть сценарий, в котором действие по дополнению сообщений может завершиться ошибкой, внедрите любой механизм отсрочки, который вы хотите, для этого действия самостоятельно в своей службе. Установите максимальный период продления подтверждения при создании своего подписчика (setMaxAckExtensionPeriod в java), чтобы гарантировать, что ваш клиент продлит срок подтверждения для каждого сообщения достаточно долго для вашей цепочки повторных попыток.
Обратите внимание, что Pub/Sub теперь имеет встроенную поддержку Мертвая надпись.
спасибо за Ваш ответ. Я отредактировал вопрос (см. edit2 внизу). Был бы рад узнать, что вы думаете об этом и какие решения вы видите для этого
Изменил мой ответ. Пожалуйста, отметьте это как принятое, если это было полезно для вас, или не стесняйтесь задавать любые другие вопросы.
Отличный ответ! Небольшое примечание, весной вы можете установить свойство spring.cloud.gcp.pubsub.subscriber.max-ack-extension-period для автоматического вызова setMaxAckExtensionPeriod() для всех подписчиков!
спасибо за ваш ответ, но ackDeadline не моя проблема. Мой вопрос касается повторных настроек, как описано выше.