Каковы настройки повтора для подписчика в pubsub и как их правильно установить в весеннем приложении?

У меня есть служба 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 раз и отправить сообщение в другую тему, чтобы по-другому с ним справиться. Или известны лучшие решения?

3
0
6 850
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать PubSubSubscriberTemplate.modifyAckDeadline(), чтобы программно продлить крайние сроки пакета сообщений, полученных по запросу. У каждого отдельного AcknowledgeablePubsubMessage также есть метод modifyAckDeadline(), если вам нужно продлить крайний срок только для нескольких избранных отставших.

Если все сообщения в этой конкретной подписке должны иметь более длительный период подтверждения, можно установить значение по умолчанию в консоли GCP, отредактировав подписку и обновив поле «Крайний срок подтверждения».

спасибо за ваш ответ, но ackDeadline не моя проблема. Мой вопрос касается повторных настроек, как описано выше.

jowi 11.02.2019 10:35

Параметры повтора предназначены для поведение gRPC; они не относятся к PubSub.

Elena Felder 11.02.2019 15:47

мой вопрос касается конкретных конфигураций pubsub и их значения для pubsub (см. вопрос выше и отредактируйте)

jowi 12.02.2019 11:52

«может быть, они вступают в силу только в том случае, если есть какие-то проблемы с подключением, но не в случаях взлома или отсутствия подтверждения» - это правильно. Установка крайнего срока подтверждения — единственный способ контролировать, когда Pub/Sub будет повторно доставлять сообщения (документы).

Elena Felder 12.02.2019 14:47

Вас также может заинтересовать это обсуждение в клиентской библиотеке Pub/Sub Java.

Elena Felder 21.02.2019 21:41

Здравствуйте @Elena, вы упомянули gRPC, чтобы повторить настройки. Как это помогает нам практически? Также я хотел бы сослаться на эту страницу документа Google: ссылка на сайт, где показан объект JSON, используемый для настройки подписки, который включает элемент с пометкой «retryPolicy». Проблема для меня заключается в следующем: как предоставить такую ​​​​конфигурацию объекту подписки, который я создаю с помощью SubscriptionAdminClient; в его API нет очевидного метода.

Tillmann 12.11.2020 11:36

Ах, да, это сбивает с толку: повторная попытка gRPC — это низкоуровневая внутренняя деталь реализации, когда вызов gRPC по какой-то причине завершается сбоем. Повторная попытка Cloud Pub/Sub — это средство высокого уровня для повторной доставки неподтвержденных или просроченных сообщений. При вызове SubscriptionAdminClient.create() вы можете настроить политику повторных попыток Pub/Sub в прототипе Subscriptiongithub.com/googleapis/java-pubsub/blob/….

Elena Felder 12.11.2020 15:25
Ответ принят как подходящий

Cloud Pub/Sub не обеспечивает экспоненциальную отсрочку для определенных сообщений. Отказ не имеет никакого эффекта, кроме как сообщить Cloud Pub/Sub, что вы не смогли обработать сообщение.

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

Ответ на редактирование 2:

Если у вас есть сценарий, в котором действие по дополнению сообщений может завершиться ошибкой, внедрите любой механизм отсрочки, который вы хотите, для этого действия самостоятельно в своей службе. Установите максимальный период продления подтверждения при создании своего подписчика (setMaxAckExtensionPeriod в java), чтобы гарантировать, что ваш клиент продлит срок подтверждения для каждого сообщения достаточно долго для вашей цепочки повторных попыток.

Редактировать 2

Обратите внимание, что Pub/Sub теперь имеет встроенную поддержку Мертвая надпись.

спасибо за Ваш ответ. Я отредактировал вопрос (см. edit2 внизу). Был бы рад узнать, что вы думаете об этом и какие решения вы видите для этого

jowi 13.02.2019 09:55

Изменил мой ответ. Пожалуйста, отметьте это как принятое, если это было полезно для вас, или не стесняйтесь задавать любые другие вопросы.

Daniel Collins 13.02.2019 17:12

Отличный ответ! Небольшое примечание, весной вы можете установить свойство spring.cloud.gcp.pubsub.subscriber.max-ack-extension-period для автоматического вызова setMaxAckExtensionPeriod() для всех подписчиков!

Agoston Horvath 04.12.2020 11:45

Другие вопросы по теме