我被告知我必须放弃大型分布式系统中的事务保证,因为CAP theorem说我不能拥有它。
我认为这是错误的,原因如下:
因此,我可以假设,出于实际目的,我可以有事务行为,但我试图保证小分区检测到它们已断开连接并关闭或以某种降级模式运行,直到修复连接为止。
更正?评论?火焰?
<小时/> 的参考文献:
答案 0 :(得分:7)
CAP定理已由Nancy Lynch等证实。在麻省理工学院实验室。
你的假设不好。是的,您可以在分布式系统上进行交易,但是您必须等待所有交易。当你受到可用性的影响时。因此,您可以具有一致性和部分容差,但不具备可用性。
在另一种情况下,您可以具有可用性和部分容差,但没有一致性,例如MongoDB或Cassandra(配置了最终一致性)。在这种情况下,您可以拥有多个数据库服务器,但您的数据将无法立即在所有服务器上使用。你的一致性受到影响,但你获得了可用性和部分容忍度。
最后一种情况是最简单的:您具有一致性和可用性,但没有部分容忍度。想想单个数据库服务器。
关于你的观点:
- 互联网路由非常可靠。
无缝可靠。
- CAP定理仅适用于两组活动机器无法通信的网络分区。
CAP定理适用于任何分布式系统。
其他两点真的没有多大意义。
还有一些其他教授声称CAP不完整,并且还有更多内容,例如延迟。但CAP定理很有道理。
还有“BASE”定理(基本可用,软状态和最终一致性)。许多NoSQL数据库都赞成这个定理。
在CAP theorem和NoSQL上查看我的博客。
答案 1 :(得分:0)
我建议你阅读本文:Brewer's Conjeture and the Feasibility of Consistent, Available, Partition-Tolerant Web Services.pdf
阅读之后,我理解了两件事。
首先,Brewer的推测是关于任何Web服务,而不仅仅是关于它们的分布式服务。然后,在这种情况下,您可以选择三个属性中的两个。例如,让我们忽略分区容错。从我的角度来看,在这种情况下,你有两个选择:
也许,你可以认为有第三种选择:使用多台机器和复制,而不关心分区容忍。我们假设这个!在这种情况下,如果某些机器或机器之间的连接崩溃,则无法保证一致性或可用性,因为系统不会有进程来恢复其正确的数据状态。在这里,请注意添加复制含义以增加分区容错。
然后,理解的第二件事是:
在分布式系统中,我们使用多台机器来传播计算和数据存储,分区容忍对它们来说是一种内在属性。我们使用一组计算机,就好像它们可以增加客户端的处理和存储资源以及可用性,而不是CAP可用性。因此,提高客户端可用性的方法是支持分区容忍:分布式系统的内在属性。
总之,适用于分布式系统的CAP定理大多说如下:在分区容忍下,不可能同时保证一致性和可用性。