整个算法主要分为两个阶段:
提议者接受到客户端的请求后,开始向超过半数的接收者进行广播提案编号,这次广播不会涉及提案值,仅向接收者广播本次提案的编号。
接受者收到提议者的议案编号广播后,处理流程如下:
首先看接受到的提案编号是不是接收者见到的值最大的提案编号,如果已经见过比本次提案编号更大的提案编号了,就拒绝响应,否则,就看看自己是否已经接受了某个提案值,如果已经接受了之前提案编号的提案值,就把接受的提案值和提案编号作为内容响应提议者,如果没有过接受提案值,那么就向提议者响应promise,并承诺不会再接受小于此次提案编号的提案值
当提议者接受到了超过半数的接受者响应的promise后,就开始向多数派发起accept请求了,这次会带上提案编号和提案值。
提案值的选择按照这样的规则,首先在收到的半数的接受者响应的promise中有没有已经接受的提案值,如果有的话,就选取其中提案编号最大的提案值作为本次accept请求的提案值,如果一个都没有,那就自己决议提案值是什么。
接受者收到提议者的accept请求后,处理流程如下:
当接受到提议者的accept请求后,先查看提案编号是不是自己见过的最大的编号值,如果是的话,就保存本次accpet的提案编号值和提案值,然后向提议者和所有学习者响应,否则的话就拒绝请求。
这里的Paxos有一个活锁问题,如下案例:提议者a发送prepare请求,接收者接受到了提议者a的prepare请求,但是由于网络的原因,提议者2的prepare请求编号更大,且先于提议者a的accept请求,如此进行反反复复造成活锁,接受者会始终处于决议提案编号的过程中,谁也不能最终决议。