【问题标题】:How to implement distributed transaction in CouchDB?如何在 CouchDB 中实现分布式事务?
【发布时间】:2016-05-23 09:55:02
【问题描述】:

我们正在将数据库从 oracle 迁移到 couchDB,因为其中一个用例是实现分布式事务管理。 例如:从 JMS 队列中读取数据并在多个文档中进行更新,如果有任何事情失败,则恢复并向 JMS 队列抛出异常。 众所周知,couchDB 不支持分布式事务管理。 您能否建议任何替代策略来实施此或任何其他出路?

【问题讨论】:

标签: hadoop couchdb distributed-transactions


【解决方案1】:

除了技术方面,我觉得你可能对它的底线感兴趣。

如上所述,分布式事务是不可能的——这个概念甚至不存在,因为它没有必要。事实上,与关系世界不同的是,95% 的时间当你觉得你需要他们时,这意味着你做错了。

我会直截了当地告诉您:将您的关系数据转储到 couchdb 最终会成为写入和读取的噩梦。首先你会说:我怎样才能进行交易?对于后来者:我该如何加入?两者都是不可能的,并且是甚至不存在的概念。

很多人得出的方便结论是“CouchDb 还没有为企业做好准备或 ACID 不够”。但事实是,您需要花时间重新考虑您的数据结构。

您需要重新考虑您的数据结构并使其面向文档,因为如果您不这样做,您就偏离了 couchdb 的预期用途——而且您知道这是一个有风险的领域。

阅读 DDD 和聚合设计,并将您的记录转换为 DDD 实体和聚合。所以CouchDb 会有一个ETL 层。如果您没有时间这样做,我建议您不要使用 CouchDb——尽管我很喜欢它。

【讨论】:

    【解决方案2】:

    CouchDB 没有分布式事务所需的属性,因此这是不可能的。所有主要的分布式事务算法(两阶段提交协议、RAMP 和 Percolator 样式的分布式事务,您可以在此 answer 中找到详细信息)都需要记录级别的线性化。不幸的是,CouchDB 是一种 AP 解决方案(在 CAP 定理意义上),因此它甚至不能保证记录级别的一致性。

    当然,您可以禁用复制以使 CouchDB 保持一致,但随后您将失去容错能力。另一种选择是使用 CouchDB 作为存储并在其上构建一致的数据库,但这对您的任务来说是多余的,并且不使用任何 CouchDB 特定的功能。第三种选择是使用 CRDT,但它仅适用于您的交易是可交换的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 2014-02-02
      • 2019-07-11
      • 2017-10-19
      相关资源
      最近更新 更多