首页 > 解决方案 > 有没有办法使用 GCP Firestore、PubSub 和消息排序来实现事务发件箱模式

问题描述

我们正在开发一种将内部数据存储在 GCP Firestore 中的服务。对于数据的一些变化,我们需要向外部服务发送消息。

为了确保可靠性,我们希望当且仅当更改我们内部数据的事务被提交时才发送消息。

为了实现这个目标,我们将使用事务发件箱模式。因此,我们创建了一个 Firestore 集合,我们将新事件/消息作为文档附加到该集合中。因为 Firestore 没有事务 WAL 的概念(至少作为公共 API),所以我们不能使用事务日志拖尾模式。所以我们唯一的选择是 轮询发布者模式。但这会导致缺少消息排序,因为我们无法确定 transactional-outbox 集合中的哪些事件是首先创建的。请注意,仅应用程序端的文档时间戳不是一个选项,因为它不会告诉我们首先提交了哪个事务。

注意:我们可以使用云函数来获取有关 transactional-outbox 集合中新文档的更新,但它也不能保证排序。

注意 2:我们使用 GCP PubSub 作为队列,我们​​在其中传播来自 transactional-outbox 集合的事件。

问题是:GCP Firestore 中是否有我们遗漏的功能可以帮助我们按照在 Firestore 集合中创建事件的顺序将事件传播到 PubSub 主题?

标签: firebasegoogle-cloud-firestoremicroservices

解决方案


根据 Firestore文档,当您的系统创建文档时,您可以在其中附加服务器时间戳。此时间戳可以帮助您根据创建在文档中建立顺序:

重要提示:与 Firebase 实时数据库中的“推送 ID”不同,Cloud Firestore 自动生成的 ID 不提供任何自动排序。如果您希望能够按创建日期对文档进行排序,则应将时间戳作为字段存储在文档中

下一步是在基于时间戳将文档发布到 Pub/Sub 的 Cloud Function 中创建逻辑。使用Pub/Sub ordering可以保留将消息发布到 Pub/Sub 的顺序以及订阅者接收它们的顺序。Pub/Sub 排序基于将多个消息与实体相关联的排序键,并且 Pub/Sub 根据发布顺序对交付进行排序。

根据您对按时间顺序排列的事务发件箱的要求,这可以达到该目的。


推荐阅读