【问题标题】:Delay message processing and delete before processing延迟消息处理并在处理前删除
【发布时间】:2017-02-06 02:44:32
【问题描述】:

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

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

【问题讨论】:

  • 您的意思是要延迟发布消息并且可能根本不发布消息,还是您的意思是在订阅收到消息时,您发送通知并可能想要做某事根据某人对通知的反应,订阅收到的消息是否不同?
  • @Kamal,我的意思是后者。发布消息 -> 将向订阅者的传递延迟 10 秒 -> 在这 10 秒内,我希望能够从队列中删除消息(如果用户按下撤消,通常在 10 秒内) -> 如果我不删除,消息被传递给订阅者。我可以通过本地队列机制手动构建延迟交付,但我想知道 google-pubsub 是否允许这样做。
  • 原来 AWS SQS 有这个延迟队列的概念:docs.aws.amazon.com/AWSSimpleQueueService/latest/…
  • @iPhoney,我们说的是发布订阅而不是队列。 GCP 在其 TaskQueue 服务中具有相同的功能,但不适用于 M:N 消息系统:cloud.google.com/appengine/docs/standard/python/taskqueue/…

标签: google-cloud-pubsub


【解决方案1】:

取决于你是否也写订阅者:

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

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

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

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

你也可以用task-queue+pubsub-topic代替pubsub-topic+pubsub-topic来实现上面的逻辑。

【讨论】:

  • 谢谢加布里埃尔,我想我明白了,虽然含糊不清。我还没有使用 pubsub,如果我延迟 ack 会多久重试一次?另一部分是如果在阈值时间之前没有清除消息,我可以使用句柄/标识符删除消息吗?
  • 这将取决于它是拉还是推主题。一般来说,它将继续重试长达 7 天。重试引用的间隔:“Pub/Sub 系统将以下任何 HTTP 状态代码解释为成功:200、201、204 或 102。如果您的服务返回任何其他代码,Google Cloud Pub/Sub 将重试最多 7 天,使用指数退避算法(上限为 10 秒)”。默认情况下,确认截止日期为 10 秒,但您可以在代码中更改它。请参阅此部分:cloud.google.com/pubsub/docs/subscriber#ack_deadline
  • 再次感谢您分享如何使其与 pubsub 一起使用。随着平台的成熟,我的 2 美分将队列公开为具有延迟交付功能的单独产品或在 PubSub 中构建相同的功能可能很有用。
  • Google Cloud Tasks 已经存在。但是他们没有拉队列,只有推送队列。
  • 在不确认或不确认的情况下删除 Pub/Sub 消息显然不受 Java 客户端支持,需要一些解决方法github.com/googleapis/java-pubsub/issues/20
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    只是想分享一下,我注意到 Pub/Sub 支持重试策略 1 是 2020-06-16 2 的 GA。

    如果确认截止日期到期或订阅者以否定确认响应,Pub/Sub 可以使用指数退避再次发送消息。

    如果未设置重试政策,Pub/Sub 会在确认截止日期到期或订阅者以否定确认响应后立即重新发送消息。

    如果设置了最大回退时间,则默认最小回退时间为 10 秒。如果设置了最小回退时间,则默认最大回退时间为 600 秒。

    您可以指定的最长退避时间为 600 秒。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多