如何在 Cosmos DB 中围绕 SQL API 和 Graph DB 做分布式事务协调器?
How to do distributed transaction cordination around SQL API and GraphDB in CosmosDB?
我有一个 Customer
容器,其中的项目代表 CosmosDB
中 SQL API (DocumentDB)
中的单个客户。我还有一个 Gremlin API (GraphDB)
和客户的 shoppingcart
数据。这两个数据都是temporary/transient。客户可以选择清除购物车,这将删除临时customer
和shoppingcart
数据。
目前我进行了单独的调用,一个调用 SQL API (DocumentDB)
和 Gremlin API (GraphDB)
,这两个调用都有效,但我想将这两个调用作为事务处理(ACID 原则)。要删除 customer
,我调用 Gremblin API
并删除 shoppingcart
数据,然后调用 SQL API
删除 customer
。但是,如果使用 SQL API
(第二步)删除客户失败,我想回滚在第一次调用中所做的更改,这将回滚已删除的 shoppingcart
数据。在 T-SQL 世界中,这是通过 commit
和 rollback
完成的。
如何围绕 customer
和 shoppingcart
数据的删除操作实现 分布式事务协调?
由于您在 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 中也不存在。想到一个可能的解决方法:
- 更新 collection 购物车中的元素。将标志
to-be-deleted
设置为 true
并将这些元素的 TTL 设置为 now() + 5 minutes
- 删除
customer
collection中的元素。如果这有效,一切都很好。
- 如果删除失败,请重新更新购物车。删除
to-be-deleted
标志并删除 TTL,这样 Comsos DB 就不会自动删除它。
当然,您还需要更新 运行 对购物车的任何查询,以排除任何带有删除标志的元素。
我有一个 Customer
容器,其中的项目代表 CosmosDB
中 SQL API (DocumentDB)
中的单个客户。我还有一个 Gremlin API (GraphDB)
和客户的 shoppingcart
数据。这两个数据都是temporary/transient。客户可以选择清除购物车,这将删除临时customer
和shoppingcart
数据。
目前我进行了单独的调用,一个调用 SQL API (DocumentDB)
和 Gremlin API (GraphDB)
,这两个调用都有效,但我想将这两个调用作为事务处理(ACID 原则)。要删除 customer
,我调用 Gremblin API
并删除 shoppingcart
数据,然后调用 SQL API
删除 customer
。但是,如果使用 SQL API
(第二步)删除客户失败,我想回滚在第一次调用中所做的更改,这将回滚已删除的 shoppingcart
数据。在 T-SQL 世界中,这是通过 commit
和 rollback
完成的。
如何围绕 customer
和 shoppingcart
数据的删除操作实现 分布式事务协调?
由于您在 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 中也不存在。想到一个可能的解决方法:
- 更新 collection 购物车中的元素。将标志
to-be-deleted
设置为true
并将这些元素的 TTL 设置为now() + 5 minutes
- 删除
customer
collection中的元素。如果这有效,一切都很好。 - 如果删除失败,请重新更新购物车。删除
to-be-deleted
标志并删除 TTL,这样 Comsos DB 就不会自动删除它。
当然,您还需要更新 运行 对购物车的任何查询,以排除任何带有删除标志的元素。