作者回复: 从你的提问中,可以看出你很爱思考。首先,非常抱歉,因为要忙每周的上线稿子定稿和后续新章节,所以没能及时回复,后面我会注意这个问题,尽量及时回复,希望理解。下面看一下这三个问题:
1. 2pc和3pc的第一步在文中的类似是指,均是通过协调者询问参与者是否可以正常执行事务提交操作,参与者也都会给协调者回复。在2pc中,如果所有参与者都返回结果后,会进入第二阶段的提交阶段,也可以说是执行阶段,根据第一阶段的投票结果,进行提交或取消。在3pc中,进入真正的提交阶段前,会有一个预提交阶段,这个预提交阶段不会做真正的提交,会将相关信息记录到事物日志中,当所有参与者都返回YES后,才会进入真正的提交阶段或执行阶段。
2. 3pc通过在协调者和参与者均引入了超时机制(2pc只是在协调者引入了超时)减少了整个集群的阻塞时间,在一定程度上减少或减弱了2pc中出现的同步阻塞问题;3pc中引入了预提交阶段,相对于2pc来讲,相当于增加了一个缓冲,保证了在最后提交阶段之前各参与节点的状态是一致的。
3. 不知道你说的回查是不是指的“失败重试”?如果是的话,这个和业务设计有关系,在介绍ebay系统中有提到,但本文主要是针对基于分布式消息的最终一致性方案的原理进行介绍,所以没有展开介绍。
作者回复: 不阻塞的主要原因是在三阶段中引入了超时机制,有了超时机制协调者不用死等其它节点,其它节点也无需死等协调者,从而不会造成堵塞。
作者回复: 不是绝对地没有单点故障问题了,是一定程度上减少了单点故障带来的问题。三阶段协议中,参与者也引入了超时机制,如果长时间没有得到协调者的响应,在默认情况下,参与者会自动将超时的事务进行提交,不会像两阶段提交那样被阻塞住。
作者回复: 你这个问题提的很好!没有说必须采用MQ,但是MQ天生就是为了高效信息交互而生,所以我在这里是以MQ进行讲解的。使用DB自然是可以的,不过考虑到DB为了保证各种约束而产生的开销,性能上肯定会打一定的折扣。