【发布时间】:2016-05-23 09:55:02
【问题描述】:
我们正在将数据库从 oracle 迁移到 couchDB,因为其中一个用例是实现分布式事务管理。 例如:从 JMS 队列中读取数据并在多个文档中进行更新,如果有任何事情失败,则恢复并向 JMS 队列抛出异常。 众所周知,couchDB 不支持分布式事务管理。 您能否建议任何替代策略来实施此或任何其他出路?
【问题讨论】:
标签: hadoop couchdb distributed-transactions
我们正在将数据库从 oracle 迁移到 couchDB,因为其中一个用例是实现分布式事务管理。 例如:从 JMS 队列中读取数据并在多个文档中进行更新,如果有任何事情失败,则恢复并向 JMS 队列抛出异常。 众所周知,couchDB 不支持分布式事务管理。 您能否建议任何替代策略来实施此或任何其他出路?
【问题讨论】:
标签: hadoop couchdb distributed-transactions
除了技术方面,我觉得你可能对它的底线感兴趣。
如上所述,分布式事务是不可能的——这个概念甚至不存在,因为它没有必要。事实上,与关系世界不同的是,95% 的时间当你觉得你需要他们时,这意味着你做错了。
我会直截了当地告诉您:将您的关系数据转储到 couchdb 最终会成为写入和读取的噩梦。首先你会说:我怎样才能进行交易?对于后来者:我该如何加入?两者都是不可能的,并且是甚至不存在的概念。
很多人得出的方便结论是“CouchDb 还没有为企业做好准备或 ACID 不够”。但事实是,您需要花时间重新考虑您的数据结构。
您需要重新考虑您的数据结构并使其面向文档,因为如果您不这样做,您就偏离了 couchdb 的预期用途——而且您知道这是一个有风险的领域。
阅读 DDD 和聚合设计,并将您的记录转换为 DDD 实体和聚合。所以CouchDb 会有一个ETL 层。如果您没有时间这样做,我建议您不要使用 CouchDb——尽管我很喜欢它。
【讨论】:
CouchDB 没有分布式事务所需的属性,因此这是不可能的。所有主要的分布式事务算法(两阶段提交协议、RAMP 和 Percolator 样式的分布式事务,您可以在此 answer 中找到详细信息)都需要记录级别的线性化。不幸的是,CouchDB 是一种 AP 解决方案(在 CAP 定理意义上),因此它甚至不能保证记录级别的一致性。
当然,您可以禁用复制以使 CouchDB 保持一致,但随后您将失去容错能力。另一种选择是使用 CouchDB 作为存储并在其上构建一致的数据库,但这对您的任务来说是多余的,并且不使用任何 CouchDB 特定的功能。第三种选择是使用 CRDT,但它仅适用于您的交易是可交换的。
【讨论】: