如何在 Cosmos DB 中围绕 SQL API 和 Graph DB 做分布式事务协调器?

How to do distributed transaction cordination around SQL API and GraphDB in CosmosDB?

我有一个 Customer 容器,其中的项目代表 CosmosDBSQL API (DocumentDB) 中的单个客户。我还有一个 Gremlin API (GraphDB) 和客户的 shoppingcart 数据。这两个数据都是temporary/transient。客户可以选择清除购物车,这将删除临时customershoppingcart数据。

目前我进行了单独的调用,一个调用 SQL API (DocumentDB)Gremlin API (GraphDB),这两个调用都有效,但我想将这两个调用作为事务处理(ACID 原则)。要删除 customer,我调用 Gremblin API 并删除 shoppingcart 数据,然后调用 SQL API 删除 customer。但是,如果使用 SQL API(第二步)删除客户失败,我想回滚在第一次调用中所做的更改,这将回滚已删除的 shoppingcart 数据。在 T-SQL 世界中,这是通过 commitrollback 完成的。

如何围绕 customershoppingcart 数据的删除操作实现 分布式事务协调

由于您在 Cosmos DB 中没有跨不同 collections (only within the partition of one container) 的事务,因此这不可能直接实现。

下一个最好的办法是使用 Change Feed. It gets triggered whenever an item gets changed or inserted. But: It does not get triggered on deletes. So you need another little workaround of "soft deletes”。基本上,您为该文档创建一个标志("to-be-deleted" 等)并很快将其 TTL 设置为某个值。这会触发更改提要,您可以从那里删除另一个 collection 中的项目。

这一切是否比您目前拥有的更好?老实说,如果你问我,也不是真的。

//更新:添加关于 commit/rollback 的要点:这在 Cosmos DB 中也不存在。想到一个可能的解决方法:

  1. 更新 collection 购物车中的元素。将标志 to-be-deleted 设置为 true 并将这些元素的 TTL 设置为 now() + 5 minutes
  2. 删除customercollection中的元素。如果这有效,一切都很好。
  3. 如果删除失败,请重新更新购物车。删除 to-be-deleted 标志并删除 TTL,这样 Comsos DB 就不会自动删除它。

当然,您还需要更新 运行 对购物车的任何查询,以排除任何带有删除标志的元素。