如何在couchdb中实现分布式事务?

2o7dmzc5  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(597)

我们正在将数据库从oracle迁移到couchdb,因为其中一个用例是实现分布式事务管理。例如:从jms队列读取数据并在多个文档中更新它,如果任何操作失败,则返回并向jms队列抛出异常。我们知道couchdb不支持分布式事务管理。你能不能建议一些其他的策略来实现这一点或任何其他的出路?

cbeh67ev

cbeh67ev1#

不仅仅是技术方面,我觉得你可能对这个问题的底线感兴趣。
正如前面提到的,分布式事务是不可能的——这个概念甚至不存在,因为它不是必需的。事实上,与关系世界不同的是,95%的时候,当你觉得你需要他们时,这意味着你做错了什么。
我将直截了当地告诉您:将关系数据转储到couchdb最终将成为写入和读取的噩梦。首先你会说:我怎么做交易?我该怎么做?两者都是不可能的,都是根本不存在的概念。
很多人得出的方便的结论是“couchdb还没有做好企业准备或者不够酸”。但事实是,您需要花时间重新考虑数据结构。
您需要重新考虑您的数据结构,并使它们面向文档,因为如果您不这样做,您就偏离了couchdb的预期用途——您知道这是一个危险的领域。
阅读ddd和聚合设计,并将您的记录转换为ddd实体和聚合。所以couchdb有一个etl层。如果你没有时间这么做,我建议你不要使用couchdb,因为我非常喜欢它。

ltqd579y

ltqd579y2#

couchdb没有分布式事务所必需的属性,所以这是不可能的。所有主要的分布式事务算法(两阶段提交协议、ramp和percolator风格的分布式事务,您可以在这个答案中找到详细信息)都需要记录级别的线性化。不幸的是couchdb是ap解决方案(在cap定理的意义上),所以它甚至不能保证记录级别的一致性。
当然,您可以禁用复制以使couchdb保持一致,但这样您将失去容错能力。另一种选择是使用couchdb作为存储,并在其上构建一个一致的数据库,但这对于您的任务来说是一种过度的操作,并且不使用任何couchdb特定的特性。第三种选择是使用crdt,但它只在事务是可交换的情况下工作。

相关问题