如何确保一次最多处理一条消息?

问题描述 投票:0回答:1

我想知道如何使用 Go 中的 Google 发布/订阅功能一次处理一条消息。我为此使用官方库,https://pkg.go.dev/cloud.google.com/go/pubsub#section-readme。该事件正在被与多个实例一起运行的服务消耗,因此任何内存锁定机制都将不起作用。

我意识到这样做是一种反模式,所以让我解释一下我的用例。使用 mongoDB,我将对象数组存储为每个实体的嵌入文档。正在发布的事件正在修改该数组的部分内容并保存它。如果我一次收到多个事件并且它们同时开始处理,则其中一个保存将覆盖另一个。所以我在想一个解决方案是确保一次只处理一条消息,并且最好使用云发布/订阅中的任何内置功能来执行此操作。否则我正在考虑在数据库中实现一些锁定机制,但我想避免这种情况。

如有任何帮助,我们将不胜感激。

mongodb go google-cloud-pubsub
1个回答
2
投票

你可以想象两件事:

  • 您可以在 PubSub 中使用排序密钥。这样,所有与同一个对象相关的消息都会按顺序一一传递。
  • 您可以使用 PubSub 的 PUSH 订阅来推送到 Cloud Run 或 Cloud Functions。对于 Cloud Run,将并发设置为 1(Cloud Functions gen1 默认情况下),并将最大实例设置为 1。就像您一次只能处理一条消息一样,所有其他消息都将被拒绝(429 HTTP 错误代码)并将被重新排队到 PubSub。问题是您无法像以前一样使用排序键并行处理

类似且更容易实现的事情是使用 Cloud Tasks 而不是 PubSub。使用 Cloud Tasks,您可以对队列设置速率限制,并将

maxConcurrentDispatches
设置为 1(并且您不必对 Cloud Functions 最大实例数或 Cloud Run 最大实例数和并发数执行相同操作)

© www.soinside.com 2019 - 2024. All rights reserved.