关于分布式事务的一些知识点
只要涉及两个个体之间协同工作就会遇到的基本问题。问题的名字叫“两军问题”。
两军问题 :
两个将军 A1 和 A2 决定攻打同一个敌人 B ,任一方都没有敌人强大,所以只有共同进攻才有胜算。敌军正好位于两个将军之间,意味着信使可能会被敌军抓住。两军问题指的就是在这样的条件下两个将军如何就是否进攻达成共识。
两军问题无解
有两位将军分别为A1与A2,准备要攻打B,A1计划明日9点准时同时攻击,并将消息发送给A2。
A1的信使必须要经过B的山谷,A1的信使能否到达A2是个未知数,有可能信使被抓住砍头。于是A1和A2约定,如果A2收到了A1的信使,就立刻派信使通知A1确认。同样的A2的信使也要经过B,也可能会被抓住。
那么故事开始了.....
A1信使出发了,带出去的信的内容如下:“上午9:00准时攻城”。然后A1耐心等待......
A1信使顺利B,A2获知了信息:“上午9:00准时进攻”,A2按照约定,立马将回复消息派遣信使发出:“上午9:00准时攻击,A2确认”,因为此时A1还不知道A2是否已经知道该军事计划。然后,A2伸长脖子在村口耐心等待...........
A2信使到达A1处,此时A1获知了A2同意了该军事计划,即“上午9:****00准时进攻”。此时A1已经同步双方的意图,但是A2却不知道自己的信使有没有到达Alice处啊!
A1需要继续派遣信使将这个事实告诉A2,信的内容如下:“上午9:00准时攻击,A2确认,A1确认”。
A1的信使安全到达A2,A2终于知道自己的信使已经已经安全到达了。但是事情到这里就结束了吗?
No!
A1还在一棵歪脖子树下等待信使安全到达的回信!所以A2还需要派遣信使发出:
“上午9:****00准时攻击,A2确认,A1确认,A2确认”。
............
两军问题主要揭示了在连接不可靠的情况下,保证两节点状态同步有多么的难,而互联网恰巧就是这么一个连接不可靠的网络(TCP 协议不可能保证两个网络终端之间的状态是一致的),举个例子通过互联网连接的两台计算机的屏幕上,要想百分百保证随时都显示相同的字符,是不可能的。认识到网络的这种不确定性,是理解所有分布式系统的基础
虽然理论上无解,但是通过设计我们依然能够给出一个够用的解决方案
对于两军问题我们可以努力把不确定控制到一个可以接受的程度。例如,我们可以让将军 A1 发出一百个信使送信,那么信使全部都被抓住的可能性就很小了。这样,A1 自己决定进攻,A2 只要收到哪怕一个信使的信息也会进攻。这就是一个足够好的解决方案了。
实际应用中,TCP协议三次握手就是为了降低不确定性
几种解决方案:
XA协议
多段提交
事务补偿

浙公网安备 33010602011771号