【问题标题】:How to do distributed transaction cordination around SQL API and GraphDB in CosmosDB?CosmosDB中如何围绕SQL API和GraphDB进行分布式事务协调?
【发布时间】:2019-07-28 19:19:47
【问题描述】:

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

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

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

【问题讨论】:

    标签: azure azure-cosmosdb distributed-transactions azure-cosmosdb-sqlapi azure-cosmosdb-gremlinapi


    【解决方案1】:

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

    下一个最好的办法是使用Change Feed。每当更改或插入项目时都会触发它。但是:它不会在删除时触发。所以你需要另一个“soft deletes”的小解决方法。基本上,您为该文档创建一个标志(“待删除”等)并很快将其 TTL 设置为某个值。这确实会触发然后更改提要,您可以从那里删除其他集合中的项目。

    这一切都比你现在拥有的更好吗?老实说,如果你问我,真的不是。

    //更新:补充一点关于提交/回滚:这在 Cosmos DB 中也不存在。想到的一种可能的解决方法:

    1. 更新收藏购物车中的元素。将标志 to-be-deleted 设置为 true 并将这些元素的 TTL 设置为类似于 now() + 5 minutes
    2. 删除customer 集合中的元素。如果这可行,那就太好了。
    3. 如果删除失败,请再次更新购物车。删除 to-be-deleted 标志并删除 TTL,这样 Comsos DB 就不会自动删除它。

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

    【讨论】:

    • 我忘记在原始问题中添加commit/rollback 要求。现在我已经添加到原始问题的第二段。
    • 我在我的问题中添加了另一个想法。但是,如果事务对您的应用程序场景如此重要,您可能需要重新考虑是否最好使用实际的 SQL 数据库而不是 NoSQL 存储。
    • 我不知道我是否使用了这里使用的正确术语 transaction。我唯一的要求是像 GraphDB 和 DocumentDB 这样的分布式系统应该使customershoppingcart 的状态保持同步。或者换句话说,由于操作链中最后一个分布式系统的操作失败,不应该有任何孤立文档。
    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2018-08-13
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多