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

У меня есть весенняя служба подписки на сообщения из темы в Google Cloud pubsub (вытягивание). В целом работает правильно. Но я хочу иметь больший контроль над повторно отправленными сообщениями. Моей службе иногда требуется заблокировать сообщение или просто пропустить 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 раз и отправить сообщение в другую тему, чтобы обработать его по-другому. Или известны какие-нибудь лучшие решения?


person jowi    schedule 05.02.2019    source источник


Ответы (2)


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

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

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

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

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

Обратите внимание, что в Pub / Sub теперь встроена поддержка Dead Lettering.

person Daniel Collins    schedule 12.02.2019
comment
спасибо за Ваш ответ. Я отредактировал вопрос (см. Edit2 внизу). Будем рады узнать, что вы думаете об этом и какие решения вы видите для этого - person jowi; 13.02.2019
comment
Изменил свой ответ. Пожалуйста, отметьте это как принятое, если это было полезно для вас, или не стесняйтесь задавать любые другие вопросы. - person Daniel Collins; 13.02.2019
comment
Отличный ответ! Небольшая заметка: весной вы можете установить свойство spring.cloud.gcp.pubsub.subscriber.max-ack-extension-period для автоматического вызова setMaxAckExtensionPeriod() для всех подписчиков! - person Agoston Horvath; 04.12.2020

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

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

person Elena Felder    schedule 06.02.2019
comment
спасибо за ваш ответ, но ackDeadline не моя проблема. Мой вопрос касается retrySettings, как описано выше. - person jowi; 11.02.2019
comment
Настройки повтора предназначены для поведение gRPC; они не зависят от PubSub. - person Elena Felder; 11.02.2019
comment
мой вопрос касается конкретных конфигураций pubsub и их значения для pubsub (см. вопрос выше и отредактируйте) - person jowi; 12.02.2019
comment
возможно, они вступят в силу только при наличии некоторых проблем с подключением, но не в случае отсутствия или отсутствия подтверждений - это правильно. Установка крайнего срока подтверждения - единственный способ контролировать, когда Pub / Sub будет повторно доставлять сообщения (документы) - person Elena Felder; 12.02.2019
comment
Вас также может заинтересовать это обсуждение на Клиентская библиотека Pub / Sub Java. - person Elena Felder; 21.02.2019
comment
Привет, @Elena, вы обратились к gRPC, чтобы повторить настройки. Как это нам помогает на практике? Также я хотел бы сослаться на эту страницу документа Google: ссылка, где показан объект JSON, используемый для настройки подписки, который включает элемент с меткой retryPolicy. Для меня проблема заключается в следующем: как предоставить такую ​​конфигурацию объекту подписки, который я создаю с помощью SubscriptionAdminClient; в его API нет очевидного метода. - person Tillmann; 12.11.2020
comment
Ах, да, это сбивает с толку: повторная попытка gRPC - это низкоуровневая внутренняя деталь реализации, когда вызов gRPC по какой-то причине завершается неудачно. Cloud Pub / Sub retry - это высокоуровневое средство для повторной доставки недоставленных сообщений или сообщений с истекшим сроком действия. При вызове SubscriptionAdminClient.create() вы можете настроить политику повторов Pub / Sub в Subscription proto - github.com/googleapis/java-pubsub/blob/ - person Elena Felder; 12.11.2020