firebase - 有没有办法使用 GCP Firestore、PubSub 和消息排序来实现事务发件箱模式
问题描述
我们正在开发一种将内部数据存储在 GCP Firestore 中的服务。对于数据的一些变化,我们需要向外部服务发送消息。
为了确保可靠性,我们希望当且仅当更改我们内部数据的事务被提交时才发送消息。
为了实现这个目标,我们将使用事务发件箱模式。因此,我们创建了一个 Firestore 集合,我们将新事件/消息作为文档附加到该集合中。因为 Firestore 没有事务 WAL 的概念(至少作为公共 API),所以我们不能使用事务日志拖尾模式。所以我们唯一的选择是 轮询发布者模式。但这会导致缺少消息排序,因为我们无法确定 transactional-outbox 集合中的哪些事件是首先创建的。请注意,仅应用程序端的文档时间戳不是一个选项,因为它不会告诉我们首先提交了哪个事务。
注意:我们可以使用云函数来获取有关 transactional-outbox 集合中新文档的更新,但它也不能保证排序。
注意 2:我们使用 GCP PubSub 作为队列,我们在其中传播来自 transactional-outbox 集合的事件。
问题是:GCP Firestore 中是否有我们遗漏的功能可以帮助我们按照在 Firestore 集合中创建事件的顺序将事件传播到 PubSub 主题?
解决方案
根据 Firestore文档,当您的系统创建文档时,您可以在其中附加服务器时间戳。此时间戳可以帮助您根据创建在文档中建立顺序:
重要提示:与 Firebase 实时数据库中的“推送 ID”不同,Cloud Firestore 自动生成的 ID 不提供任何自动排序。如果您希望能够按创建日期对文档进行排序,则应将时间戳作为字段存储在文档中
下一步是在基于时间戳将文档发布到 Pub/Sub 的 Cloud Function 中创建逻辑。使用Pub/Sub ordering可以保留将消息发布到 Pub/Sub 的顺序以及订阅者接收它们的顺序。Pub/Sub 排序基于将多个消息与实体相关联的排序键,并且 Pub/Sub 根据发布顺序对交付进行排序。
根据您对按时间顺序排列的事务发件箱的要求,这可以达到该目的。
推荐阅读
- r - 使用R中的for循环填充要列出的数据框
- python-3.x - 检查两个列表中的用户名
- hyper-v - 有什么方法可以在 Windows 的 VT-x 上运行 Docker?
- java - 如何从 Java 调用 tabula (JAR)?
- spring - Spring Boot Actuator 在一个请求中返回所有指标
- javascript - 构造函数不返回方法
- spring-boot - Spring boot2,Mysql UTF-8 编码不起作用
- python - 无法获取 URL https://pypi.python.org/simple/xlrd/
- javascript - 获取 Facebook AR 中 3d 对象的位置并通过脚本更改它们
- netsuite - 通过传递国家代码获取 NetSuite SuiteScript 2.0 中国家列表的内部 ID