我想知道如何使用 Go 中的 Google 发布/订阅功能一次处理一条消息。我为此使用官方库,https://pkg.go.dev/cloud.google.com/go/pubsub#section-readme。该事件正在被与多个实例一起运行的服务消耗,因此任何内存锁定机制都将不起作用。
我意识到这样做是一种反模式,所以让我解释一下我的用例。使用 mongoDB,我将对象数组存储为每个实体的嵌入文档。正在发布的事件正在修改该数组的部分内容并保存它。如果我一次收到多个事件并且它们同时开始处理,则其中一个保存将覆盖另一个。所以我在想一个解决方案是确保一次只处理一条消息,并且最好使用云发布/订阅中的任何内置功能来执行此操作。否则我正在考虑在数据库中实现一些锁定机制,但我想避免这种情况。
如有任何帮助,我们将不胜感激。
你可以想象两件事:
类似且更容易实现的事情是使用 Cloud Tasks 而不是 PubSub。使用 Cloud Tasks,您可以对队列设置速率限制,并将
maxConcurrentDispatches
设置为 1(并且您不必对 Cloud Functions 最大实例数或 Cloud Run 最大实例数和并发数执行相同操作)