【问题标题】:如何知道发布/订阅主题是否包含具有特定内容的消息?
【发布时间】:2022-01-11 12:41:57
【问题描述】:

我有 X 个微服务,每个微服务都发布到同一个发布/订阅主题。他们发布的消息包含微服务 ID。 我正在寻找一种方法来确保 pub/sub 已完成对某个微服务的所有消息的服务。 我目前的解决方案是统计从微服务发布的所有消息,然后统计发布/订阅主题中提供的消息(通过云功能)。这种方法存在一些已知问题,我想知道是否有更好的方法来了解 pub/sub 是否不包含来自特定微服务的消息?

【问题讨论】:

  • 似乎合乎逻辑的做法是将它们发布到不同的主题......为什么要将它们发布到同一个主题?

标签: python google-cloud-platform google-cloud-functions google-cloud-pubsub


【解决方案1】:

除了获取消息、打开并阅读消息之外,没有其他方法可以了解消息的内容。

更好的解决方案是为每种类型的消息使用单独的主题,并且订阅队列为空,这意味着所有消息都已被处理。如果您需要统计它们,您可以使用日志来跟踪您在 Cloud Functions 中的消息处理情况。

另一种方法是使用单个 PubSub 主题并在消息的属性中添加 ID。然后,您可以使用对该属性的过滤器创建 PubSUb 订阅,并像以前一样监督订阅。

该解决方案的缺点是它不符合 Cloud Functions PubSub 集成。您需要创建一个 HTTP 函数和一个 PubSub 推送订阅才能利用过滤器功能。

【讨论】:

  • 谢谢,这是一个很好的解决方案,但在我们的案例中它不起作用,因为我们确实有很多微服务同时运行。有时它们很小并且很快就结束了,为每个人提供一个 pub/sub 会有点过头了。
【解决方案2】:

我最终得到的解决方案如下:

  1. 在redis中创建一个set,并为其添加一个新的message id
  2. 在发布到 pubsub 的消息中包含此新消息 ID
  3. 在 pubsub 之后运行的云函数应该从集合中移除新的 message_id
  4. 在流​​程结束时,我们检查集合,如果它为空,则流程结束。

这也处理 pub/sub 多次发布同一消息的时间。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 2020-04-03
    • 2019-10-10
    • 1970-01-01
    相关资源
    最近更新 更多