Отложить обработку сообщения и удалить перед обработкой

Мне нужна эта возможность отправлять push-уведомления для действия в мобильном приложении, но ждать, пока пользователь отменит действие, пока, скажем, 10 секунд.

Можно ли отложить обработку сообщения, опубликованного в теме, на 10 секунд? А затем (иногда, если пользователь отменяет) удаляет сообщение до 10 секунд, если его не нужно обрабатывать?


person iPhoney    schedule 28.09.2016    source источник
comment
Вы имеете в виду, что хотите отложить публикацию сообщения и, возможно, не публиковать его вообще, или вы имеете в виду, что после получения сообщения подпиской вы отправляете уведомление и, возможно, хотите сделать что-то другое с сообщением, полученным подпиской на основе как кто-то реагирует на уведомление?   -  person Kamal Aboul-Hosn    schedule 05.10.2016
comment
@ Камал, я имею в виду последнее. Опубликовать сообщение - ›Задержка доставки подписчикам на 10 секунд -› За эти 10 секунд я хочу иметь возможность удалить сообщение из очереди (если пользователь нажимает кнопку «Отменить», обычно в течение 10 секунд) - ›Если я не удаляю, сообщение доставлено подписчикам. Я могу создать отложенную доставку вручную через механизм локальной очереди, но мне было интересно, позволяет ли это сделать google-pubsub.   -  person iPhoney    schedule 07.10.2016
comment
Оказывается, в AWS SQS есть такая концепция очередей задержки: docs .aws.amazon.com / AWSSimpleQueueService / latest /   -  person iPhoney    schedule 29.10.2016
comment
@iPhoney, мы говорим о pubsub, а не об очереди. GCP имеет те же функции в своей службе TaskQueue, но не для системы сообщений M: N: cloud.google.com/appengine/docs/standard/python/taskqueue/   -  person Gabriel Kohen    schedule 22.03.2017


Ответы (2)


Зависит от того, напишете ли вы также подписчиков или нет:

Вы можете контролировать свой код подписчика:

  1. В сообщениях Pubsub добавьте отметку времени, когда вы хотите, чтобы это сообщение было обработано.
  2. У ваших клиентов (подписчиков) есть логика для подтверждения сообщения, только если достигнута отметка времени для обработки сообщения.
  3. Сам Pubsub будет повторно пытаться доставить сообщение, пока оно не будет подтверждено (или 10 дней).

Если у вас нет контроля над подписчиком, вы можете использовать my-topic и my-delayed-topic. Люди могут публиковать в предыдущей теме, и у этой темы будет только один подписчик, которого вы реализуете:

  1. Публичное сообщение, как и раньше, в мою тему.
  2. У вас будет подписчик по этой теме, который сможет выполнять такое же регулирование, как показано выше:
  3. Если время для этого сообщения достигло, ваш обработчик опубликует / ретранслирует это сообщение в my-delayed-topic.

Вы также можете реализовать описанную выше логику с помощью очереди задач + pubsub-topic вместо pubsub-topic + pubsub-topic.

person Gabriel Kohen    schedule 22.03.2017
comment
спасибо, Габриэль, думаю, я понимаю, хотя и смутно. Я еще не использовал pubsub, как часто будут повторяться попытки, если я откладываю подтверждение? Другая часть - могу ли я удалить сообщение с помощью дескриптора / идентификатора, если оно не очищено до порогового времени. - person iPhoney; 28.03.2017
comment
Это будет зависеть от того, притягивающая это тема или подталкивающая. Как правило, повторные попытки будут продолжаться до 7 дней. Интервал повторной попытки цитирования: Любой из следующих кодов состояния HTTP интерпретируется системой Pub / Sub как успешный: 200, 201, 204 или 102. Если ваша служба возвращает любой другой код, Google Cloud Pub / Sub повторяет попытку до 7 дней с использованием алгоритма экспоненциальной отсрочки (максимум 10 секунд). По умолчанию крайний срок подтверждения составляет 10 секунд, но вы можете изменить его в своем коде. См. Этот раздел: cloud.google.com/pubsub/docs/subscriber#ack_deadline - person Gabriel Kohen; 29.03.2017
comment
Еще раз спасибо за то, что поделились, как это можно сделать для работы с pubsub. Мои 2 цента по мере развития платформы может быть полезно либо выставить Queues как отдельный продукт с функцией задержки доставки, либо создать то же самое в PubSub. - person iPhoney; 01.04.2017
comment
Google Cloud Tasks уже существует. Но у них нет очередей на вытягивание, есть только выталкивающие. - person xmedeko; 06.05.2019
comment
Удаление сообщения Pub / Sub без подтверждения или блокировки, по-видимому, не поддерживается клиентом Java и требует некоторых обходных путей github.com/googleapis/java-pubsub/issues/20 - person David Xia; 28.05.2020

Просто хотел поделиться, что я заметил, что Pub / Sub поддерживает политики повторных попыток 1, которые GA по состоянию на 16 июня 2020 г. 2.

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

Если политика повтора не задана, Pub / Sub повторно отправляет сообщение, как только истечет крайний срок подтверждения или подписчик ответит отрицательным подтверждением.

Если установлена ​​максимальная продолжительность отсрочки, минимальная продолжительность отсрочки по умолчанию составляет 10 секунд. Если установлена ​​минимальная продолжительность отсрочки, максимальная продолжительность отсрочки по умолчанию составляет 600 секунд.

Максимальная продолжительность отсрочки, которую вы можете указать, составляет 600 секунд.

person David Xia    schedule 27.08.2020