延迟消息处理并在处理前删除

Delay message processing and delete before processing

我需要这种能力来为移动应用程序中的操作发送推送通知,但要等待用户撤消操作,直到 10 秒。

是否可以将主题中发布的消息延迟 10 秒进行处理?然后(有时,如果用户确实撤消)在 10 秒之前删除消息,如果它不需要被处理?

看你写不写订阅者:

您可以控制订阅者的代码:

  1. 在您的 PubSub 消息中添加一个时间戳,用于确定何时处理该消息。
  2. 在您的客户端(订阅者)中,只有在达到处理消息的时间戳时才具有确认消息的逻辑。
  3. PubSub 将重试传递消息,直到它被确认(或 10 天)

如果您无法控制订阅者,您可以拥有 my-topicmy-delayed-topic。人们可以发布到前一个主题,该主题将只有一个您将实现的订阅者:

  1. 像以前一样将消息发布到 my-topic
  2. 将拥有该主题的订阅者,该订阅者可以执行与上面所示相同的限制。
  3. 如果该消息到达您的处理程序的时间将 publish/relay 该消息发送到 my-delayed-topic

你也可以用task-queue+pubsub-topic来实现上面的逻辑,而不是pubsub-topic+pubsub-topic。

只是想分享一下我注意到 Pub/Sub 支持重试策略 1 that are GA as of 2020-06-16 2

If the acknowledgement deadline expires or a subscriber responds with a negative acknowledgement, Pub/Sub can send the message again using exponential backoff.

If the retry policy isn't set, Pub/Sub resends the message as soon as the acknowledgement deadline expires or a subscriber responds with a negative acknowledgement.

If the maximum backoff duration is set, the default minimum backoff duration is 10 seconds. If the minimum backoff duration is set, the default maximum backoff duration is 600 seconds.

The longest backoff duration that you can specify is 600 seconds.

如果在架构上 完全可行,您可以使用Cloud Tasks。此 API 具有以下可能适合您的用例的功能:

  • 您可以安排邮件(任务)的传递
  • 您可以从队列中删除任务(在执行之前)

假设您的客户端有一些任务 ID 的存储空间:

  1. 创建一个 task,将来 schedule_time 设置为 10s
  2. 将任务名称存储在内存中(您可以在创建时为任务分配名称,或使用从创建响应返回的自动生成的 ID)。
  3. 如果用户撤消了作业,则调用 DeleteTask