一个工厂仓库的Paxos

    因为在做分布式相关的产品,学习了一下Paxos。写些学习的理解,与同道中人交流。由于是初学,期待大家拍砖指正。

   

    某工厂有一个仓库。厂里经常要调配物资出入仓库。为方便管理,仓库里划分了多个货物区,每批货物一般存一个区。

    仓库有一个管理员张师傅。厂里的职工需要存放货物时,去选一个空闲区,然后和张师傅登记,便可将货物存进该区域。

    随着业务量增多,物资出入库越来越频繁,张师傅的工作压力也越来越大。最后生了场大病请假养病。厂里想要找张师傅登记存货人都只能等着张师傅回来上班,对生产造成了严重影响。

    张师傅生病期间,厂里又聘用了一个管理员王师傅,等张师傅回来后,两个人一起完成仓库入货管理工作。仍然按照老办法管理仓库。但很快发现有问题:职员A想存货入库,找到了张师傅,张师傅找了空闲区1,并给职员A登记。当职员A卸货时,发现职员B也在往空闲区1中卸货。原来,职员B之前找到王师傅也登记了空闲区1

    有人提议,让张师傅和王师傅共用一个登记表。但厂长不同意这个方案,理由是这样虽然人员实现了备份互补,但唯一的登记表如果出现丢失或损坏,问题更严重。经过商议,最后决定:张师傅王师傅还是各自使用自己的登记表。如果有货物需要入库,负责人需要分别找张师傅王师傅登记同一个空闲区。只有两个管理员都登记成功,才可以向该区域卸货。

    按照新规定,物资调配一切正常。但随着货物进出库更越来越频繁,经常出现职员A和张师傅申请空闲区域1,登记成功后,去找王师傅,却发现职员B已经登记了空闲区域1。同样,职员B在张师傅那里也发现职员A登记了空闲区域1。于是,职员A就和王师傅申请空闲区域2。另外一边职员B和张师傅申请空闲区域2。二人到另外一个管理员处登记时,又发现空闲区域2被对方登记了。此问题越来越频繁,导致生产效率下降。

    厂里讨论此问题,这种情况下,与其两个职员都不能卸货,不如按照某种优先级让一个职员先卸货,卸完货的职员自然也就不会再去影响还在等待卸货的职员了。本着尊老爱幼,优先级就按照年龄来算吧。经过讨论决定:年长的职员,在已经成功登记一个空闲区域后,即使另外一个管理员为一个年轻的职员登记了该区域,年长的职员也可以让另外一个管理员修改登记人为自己。

    按照新规定。职员A25岁)去张师傅处登记空闲区域1,成功后,再去王师傅处登记。发现职员B35岁)已经在王师傅处登记空闲区域1,于是果断放弃空闲区域1,改为在王师傅处登记空闲区域2。职员B到张师傅处登记空闲区域1,发现职员A已经登记,但按照新规定,职员B可以将登记人修改为年长的自己。于是职员B顺利得到空闲区域1的使用权,完成卸货。职员A回到张师傅处登记空闲区域2,也成功得到空闲区域2的使用权,完成卸货。

    貌似新规定完美解决了仓库管理问题。但执行一段时间,又发现了新问题。张师傅王师傅,家中时常有事,需要请几个小时的假。按照规定,两个管理员只要有一个人不在,就无法完成一个空闲区域的登记和确权。当业务忙时,即使其中一个管理员去趟厕所或者出去吸烟,都会严重影响仓库出入货调配。

    厂长明白,根本问题还是人手不够。于是决定再招一个管理员。新管理员是李师傅。三个管理员按照之前的管理办法肯定无法解决有人临时离开的问题。所以厂里决定:首先,三个管理员不能同时离岗,要始终保证有两个管理员在岗确保可以进行空闲区域登记工作。然后,如果有职员需要向某个空闲区域卸货时,只要在两个管理员处登记成功,即可向该空闲区域卸货。这样既能保证管理员可以有离岗时间解决个人问题,又能保证不会有多个职员成功登记同一个空闲区域。

    然而,多一个管理员,并不像想象的那么简单。一天,职员A26岁)去张师傅处登记空闲区域1,成功。然后去王师傅那登记空闲区域1,成功。成功获得两个管理员的批准,取得卸货权。但当职员A向空闲区域卸货时,发现职员B36岁)也在向空闲区域1卸货,场面似曾相识。简单交流后得知,在职员A去王师傅处登记空闲区域并成功时,职员B正在李师傅处登记空闲区域1,并登记成功。职员A准备去卸货时,职员B来到王师傅处登记空闲区域1,发现职员A已经登记成功。根据规定,职员B年长,于是修改了王师傅对空闲区域1的登记记录,改为自己。职员B也获得了两个管理员对空闲区域1的登记,自然也可以去该区域卸货。

    问题到底出在哪里?为什么两个管理员时没有出现这种问题,多了一个管理员就出现了?经过众人讨论,发现两个管理员时,需要在两个管理员处登记成功确权。其中,隐含了一个规则,就是所有管理员都登记成功。这样任何职员只要有一个管理员还没登记,就不能使用空闲区域。这就促使职员都尽力去所有管理员处登记要使用的空闲区域。那么就只存在两种情况:1)要么年轻的职员动作快,在所有管理员处登记了空闲区域,使年长的职员在任何管理员处都查不到这块区域是空闲状态,促使年长职员去找其它空闲区域;2)要么,年长管理员在一个管理员处登记了这个空闲区域,即便年轻职员在所有其他管理员处登记了该区域,都难免被这个年长职员抢占该空闲区域的结局。

    但三个管理员时,潜移默化的修改了这个隐含的规则:不再需要在所有管理员处登记成功。那么,即使年轻的职员在两个管理员处登记成功,获得空闲区域使用权,仍有可能被年长的职员在没登记记录的管理员处查到这个区域是空闲状态。按照规定,年长管理员自然可以去抢占这个空闲区域,最终导致两个职员同时向一个区域卸货。

    为了解决这个问题,让厂里的人费了些头脑。首先,1)职员获得两个管理员的登记就可以认定区域可用,剩下的一个管理员就给年长的职员提供了可以去抢的空闲记录。但也不能恢复之前两个管理员时,让职员去获取所有管理员的批准,这样只要有一个管理员离开,仓库就不能调配了。2)而导致问题的根本原因是年长的职员可以抢(修改)年轻职员已经登记的记录。但这条规则似乎又不能破。因为如果登记后不能改的话,三个管理员时同样存在之前的问题:职员A/B/C分别到三个管理员处登记空闲区域1,然后又都在第二个管理员处发现其他职员登记了该区域,于是都放弃该区域,又去登记空闲区域2,如此往复,降低生产效率。

    看来已有的规定都是不能动的,只能从其它方向找突破口了。仔细想想,王师傅是知道b抢了a的登记信息的,这个登记信息有可能会导致a不再具有该区域的卸货权。那能不能在b抢了a的地盘之后,告诉a这块地可能不再属于你了。显然来不及,这时拿到区域使用权的a可能已经在卸货了。那就再早一点,在a准备卸货之前,由a自己再去他登记的两个管理员那查一下,看看有没有其他人修改自己的登记信息抢了自己的地。如果有人抢了,那就当这次白申请,毕竟人家年纪大。至少自己还没安排卸货,再找一块空闲区域申请。如果这时这块空闲区域还是只有自己的登记信息呢?直接去卸货?显然不行,b可能随后又改了王师傅的登记信息,然后过来一同卸货。这时a提议:“那我就在卸货前在登记信息上加个备注:我已经去卸货了,不要再修改我这条登记信息了,否则有可能卸货冲突。”b笑了笑说:“貌似不错,但饶了这么大一圈,你这个备注这不就是最初的不可修改他人的登记信息的方式么?遇到你这个备注,我岂不是白大你几岁了?”引起众人一阵笑声。

    但很快大家沉默了,沉默不是因为没有想到办法,而是都觉得a说的这种办法貌似还原回了不可抢占规则,但这个规则和最初的规则还是有些区别的。最初的规则是大家只登记一次,这唯一的一次登记是不可抢占修改的。而现在a提出加备注不可抢占的规则后,前前后后相当于登记了两次,而第一次是可以抢占的,第二次的备注是不能抢占的。按照这种两次登记的规则,依然会出现之前问题么(职员A/B/C分别到三个管理员处登记空闲区域1,然后又都发现在第二个管理员处发现其他职员登记了该区域。由于不可抢占,于是都放弃该区域,又去登记空闲区域2,如此往复)

    大家想反正目前也没有更好的办法,就演练一次,看看这个规则到底会不会产生和最初规则一样的后果。于是,abc同时去不同的管理员处登记空闲区域1a在张师傅处登记,b在王师傅处登记,c在李师傅处登记。登记成功后,a去王师傅处登记,发现已经被年长的b登记过了,主动放弃,然后去李师傅处登记,发现也被别人登记了,这块区域,自己没机会了,选择放弃。b去李师傅处登记,也发现被年长的c登记过了,转而去张师傅处登记,发现a登记过,但自己年长,果断修改登记人为自己。这时b已经获得了添加备注的权利。此时c去找张师傅登记,发现被b登记了,但自己年长,果断修改登记人为自己,此时c也获得了添加备注的权利。此时b开始去找张师傅加备注,却发现登记人已经不是自己而是cb这时明白c也想用这块区域,而且比自己年长。b想想自己目前往好了说相当于只在王师傅处登记了,往坏了说可能连王师傅处的登记也被c改了,甚至可能被d、e、f改了都说不定。就算现在王师傅还有自己的登记记录,那自己还要去李师傅那里登记成功才能再次取得添加备注的权利。而有c的存在,自己估计很难完成两次备注添加。所以b果断决定放弃空闲区域1的申请。这时两次登记成功的c,去张师傅和李师傅处添加备注,顺利备注成功。然后去卸货了。

    面对如此结果,大家再次沉默。同样是不可抢占的规则,前后两个规则执行的结果差距咋那么大呢?大家仔细想了想,旧的不可抢占登记的规则下,任意一个职员都可以随时在一个管理员处登记一个区域,而且一旦登记成功,别人就失去了在这个管理员处登记这个区域的机会。导致“互锁”的概率很大。新规则的登记相当于是一次预授权,在预授权阶段,大家可以根据年长优先规则去淘汰年轻职员的申请。而且任何一个职员想要去添加“不可被抢占的备注”之前,都需要至少在两个管理员处登记成功。这大大降低了年轻职员“随随便便”就在一个管理员处做备注的概率。年长职员可以优先获得两个管理员处的登记成功,提高了年长职员获得两个管理员处备注成功的概率。

    那按照这个规则去执行是否可行?大家都觉得不妥,但又说不出原因。其实大家担心的问题基本是:分析中,提到的都是提高概率,既然是有概率成功,那不论成功的概率多高,都还是有概率失败的。另外,大家明显感觉到,不计其数的职员、三个管理员、再加上两次登记的规则下,由于每个职员去做登记或者备注的顺序和时间的不同,会导致出现各种各样的情况。而分析中只考虑了一种情况,其它情况是否会“命中”失败的概率?

    厂长决定,大家的脑细胞有限,而且还有正事要做。我们就按照这个规则试运行一段时间看看效果。果不其然,经常遇到一种情况,导致申请空闲区域失败:

    a在张师傅和王师傅处登记成功,然后立刻在张师傅处添加备注。在a去王师傅处添加备注之前,b先去王师傅和李师傅处登记成功,然后又立刻在王师傅处添加备注。此时,c到李师傅处登记成功,但无法在张师傅和王师傅处登记,更无从谈起添加备注了。目前的状况是:a在张师傅处登记并备注,b在王师傅处登记并备注,c在李师傅处登记而无权备注。而ab虽然都在一个管理员处做了备注,但根据规定,显然不会再有权利在其他管理员处做备注了。从而导致abc都无法申请到这块空闲区域。

    问题出在哪?应该是c。因为c一次备注也没做,甚至c连备注的权利都没有(因为没能在两个管理员处登记成功)。只是因为c的年龄大,而导致还差一步就申请区域成功ab没能成功。ab说:“让我们去修改c的登记记录吧,改成我们自己,就可以了”。C反驳道:“不行不行,你们也不知道我是否有备注权。如果b过来修改我在李师傅处登记的记录时,我其实在张师傅处也做过登记了呢?那岂不成了一个年轻的职员在没有备注权的状态下,抢了一个年长职员的备注权。这样不妥。”这样一说,包括c在内大家都觉得,因为只有c知道自己的情况,c应该主动退出,多给年轻人些机会。

  那么c在什么情况下,应该选择主动退出?1)首先c应该还没有做任何备注,更进一步,应该是c还没有获取到备注权;2)其次,c发现已经有其它职员在某个管理员处完成备注了。满足这两个条件,c就应该去自己登记过的管理员处,删除登记记录。这样还是有一点小问题:c取消了自己在李师傅处的登记记录,但b之前在李师傅处的登记记录也没有了。b再来写备注,发现李师傅这自己之前做的登记记录不见了,怎么办?b说:“既然我来到李师傅这做备注,那就说明我已经在这登记过了,现在没有登记记录,那我就登记备注一起填写不就行了”。但ab说:“如果你来李师傅这做备注之前,我先来了并且发现李师傅这没有登记记录。然后我做了登记记录。又因为我已经在张师傅那里做过备注了,我直接也在李师傅这做备注。。。”。b立刻推翻自己的建议说:“这不行”。

    罗列一下现在的限制和我们要达到的目的:目的很简单,就是就是b要在李师傅处完成备注,而限制有1c不能自己取消登记记录(取消后会导致本应该属于b的区域,有可能被a申请走),2b不能修改c的登记记录(有违年长优先原则)。c主动站出来说:“b在李师傅处的登记记录是我给改没的,还是由我负责把登记记录改回去吧。正好我在李师傅处登记之后,我还要去王师傅处登记,那会我就能看到b在王师傅处的备注了,我自己记下来。按照规则,我还要去张师傅处尝试登记。在那我应该发现a已经添加备注了。ba都备注了,我选年长的b作为李师傅处新的登记人,大家觉得怎么样?”。bc说:“这倒是个办法,但有一个问题。如果我在你登记自己(c)之后,恢复登记人为我(b)之前,去李师傅处做备注,发现登记人是你c,我就认为备注失败了,我就会放弃申请了。之后你再把登记人改为我也没用了”。李师傅对b说:“c把登记人改回为你以后,我可以给你打个电话,然后你再过来备注一次怎么样?”b说:“可以,不过我去了也就是做备注。要不让c直接帮我备注算了,备注完了李师傅给我打个电话,告诉我备注成功了。然后我就直接安排卸货了”。

    c说:“这倒是省事,但登记和备注的约束可不一样。按照规定,对于登记,只要年龄大,就可以随便改年轻职员的登记记录。但对于备注,是需要备注权的。此时我在李师傅处登记成功过,张师傅王师傅又都被ab备注过,我无法在他们那登记,也就无法获取到备注权。那我按照b说的,帮助b做备注,这样合适么?”。大家都觉得c说的有道理,但又觉得差了点什么。其实,大家觉得差了点的东西应该是:之前规定的备注权是为自己做备注的权利,而现在c所说的备注权,是为别人(b)做备注的权利。那么现在的疑问是,为别人做备注,我们需不需要备注权(在两个管理员处登记成功)?我们先回顾一下备注权(在两个管理员处登记成功)的由来:为了防止a/b/c分别“抢”到不同管理员处对一个区域的使用权,而导致三个职员都无法获取到该区域使用权。需要通过年长优先为原则的登记,先由老职员“挤”掉年轻职员,在确保老职员具备了“占用区域” 的能力后(备注权),再由该职员去做备注,“夯实”自己对该区域的使用权。再进一步简化备注权的本质:“在当前区域申请者中,备注权是职员对自己是最年长的职员的一种预判”。有了这个预判,职员才能去管理员处做这个区域的预留(备注)。如果没有这个预判(备注权),随意去一个管理员处做备注,很可能影响其它更年长的职员申请该区域。因为最年长的职员才最应该申请到区域。即便是已经有职员先于最年长职员做了备注,最年长的职员也是最有机会获得仅次于自己年龄的已备注职员,最年长职员是去帮别人备注的最合适人选。

    那么就很显然了,不论是为自己做备注,还是为其它职员做备注,为了确定自己是相对年长的职员,先获取备注权是必须要有的。那么问题又来了,c如何去张师傅和王师傅处登记,以便获取到备注权,然后帮b在李师傅处添加备注呢?大家考虑了很久,这时经验丰富的张师傅说:“按照现在的规定,依我看,登记和备注已经可以分开记录了。职员能不能卸货,只看备注就行,有没有登记记录无所谓,因为现在登记工作啊,本质上已经变成获取备注权和查询已有备注人的工作了,和最终是否具有区域使用权没什么关系了。有备注记录才管用,是这个道理吧?”王师傅补充说:“那这样一来,c就不用顾忌b在我这的登记记录了。只要c来了,就可以在我这登记,把b改掉。因为c在改b的登记记录的同时,肯定也可以看到b在我这备注过了。按照规定,c肯定不会在获得备注权之后‘自私’的去为自己做备注,而应该是为b做备注。”李师傅补充说:“这样还有一个好处,即使进入备注阶段,由年长职员做登记人,也可以免除很多年轻职员到我这来查备注人。”厂长拍案,就这么定了。

    按照最新规定,很长时间里,仓库调配都没再出现冲突问题。但还是有些效率问题。比如之前讨论的情况,a在张师傅处的状态是登记成功、备注成功,b在王师傅处是备注成功,c帮b在李师傅处备注成功,c在王师傅和李师傅处登记成功。但有时还没等李师傅通知b,李师傅就有事请假回家了。这时b就无法取得该区域的使用权了。针对这种情况,a说:“按照目前的规则,我怎么折腾肯定都是无权使用这块区域了。与其看着b也用不了,不如让c在李师傅处改备注人为b之后,再去张师傅那,把备注人也改为b算了。这样,就算李师傅离岗了,b也有这块区域的使用权”。

    厂长存疑:“为了解决管理员离岗的小问题,去允许修改备注信息,不会因小失大吧?因为我们一直规定备注信息是圣神不可修改的。” 让我们看看,新规则下是否还存在老问题(可以按年龄抢占,导致的a对某区域确权后,卸货的同时,b也对该区域确权,然后也去卸货):a在张师傅王师傅处登记并备注,然后去卸货。b在李师傅和王师傅处登记后,也获得了备注权。但b会去备注自己,然后获得区域使用权,最后像以前一样去与a向同一区域卸货么?按照新规则,b不会这么做,因为b在修改王师傅处的登记时,王师傅提醒b:“登记记录你可以改,但a之前已经备注过了,如果你以后获得了备注权,记得要为a备注,不要备注了自己”。所以,b在李师傅处备注时,明确的填写备注人为a。似乎不再出现之前的问题了。为什么同样是可以修改使用权,老规则下会有问题,在新规则下却没有出问题?仔细想想,新规则不是完全允许抢占的,反而依然保持了尊重现有的备注人,然后再去帮助现有备注人去完成更多的备注。但还是有一个前提,就是修改备注人要尽量保证备注人记录的职员年龄越来越大,也就是说不允许将备注人修改为比当前备注人还年轻的职员。因为这样有违年长优先原则,同时也的确不利于备注人信息向着指向同一个职员(年龄最大的职员)的目标发展。

  随着厂里职员越来越多,多个职员申请一个空闲区域的情况越来越多。同时也暴露了一个问题:a在张师傅和王师傅处登记成功后,在张师傅处备注自己;b在王师傅和李师傅处登记成功后,在李师傅处备注自己;这时,c在张师傅和王师傅处登记成功,然后在王师傅处备注a。然后王师傅电话知会a:“c帮你做了备注”。a已经取得区域使用权,然后去卸货,却发下b也在该区域卸货。经过简单交流得知,在a安排卸货的同时,d在王师傅和李师傅处登记成功,然后在王师傅处帮b备注,王师傅看b比a年长,就同意了d修改备注人为b,然后电话知会b:“d帮你在我这做了备注”。此时,b也取得了区域的使用权,然后去卸货,撞见了a。

  厂里组织讨论,分析原因:和之前出现多个职员向同一区域卸货性质相同,都是对“共享”管理员王师傅的争夺导致。这里说“共享”的含义是指,ab分别在张师傅和李师傅处登记成功,这次ab又分别在张师傅和李师傅处备注了自己。形成了一个完全对称的状态。如果没有cd的参与,按照目前的规定ab完全可以搞定,不会出现去同一区域卸货:要么1a先在王师傅处备注,之后即使b再来王师傅处登记成功,也会去帮助a在其他管理员处做备注。要么2b先到王师傅处登记成功,那么a就没机会再来王师傅处备注,b就可以不紧不慢的完成备注,然后去卸货。简单说就是:在王师傅处,年轻职员的备注和年长职员的登记谁先来,谁就能拿到这个区域的使用权。只要先来的备注(或登记)确定了,那么区域的归属也就确定了。

  但在a的备注和b的登记都还没到王师傅处时,c来了。而且c是带着a的备注信息来的,他打破了上边的情况:如果b没有在王师傅处登记,c会在王师傅处备注a;如果b在王师傅处登记了,按照规定,c依然会无视b的登记,仍然在王师傅处备注a,“保送”a去该区域卸货。打破了上边说的确定性,就为出现不确定的结果埋下了伏笔。这时如果只有这三个职员,也不会有问题:b已经被剥夺了备注权,没机会再获得区域使用权了,c也成为了a的“帮手”,区域使用权铁定是a的了。但恰巧,d君“及时”现身,在王师傅和李师傅处的登记成功,然后拿着备注人信息b,来到了王师傅处,比较当前备注人ab的年龄后,毫不犹豫,将备注人改为b,“保送”b去该区域卸货。

  整理一下思路:年长的职员(d),随时会出现,不管是否有职员已经在该区域卸货。而只要有一个已经备注了的职员(b)比当前已经取得卸货权的职员(a)年长,那就必然会引起这个问题。简单总结上面的问题条件:1)随时出现的年长职员;2)一个相对年长的已备注人,并且他还没有获得区域使用权。想要解决上面的问题,就要从这两个条件找突破口。条件1)能禁止么?当有职员已经获取到卸货权的时候,不让年长职员再来参与区域申请。那么如何得知是否已经有人获取到该区域的卸货权?给所有人打电话:“您是否已经使用该区域了?”那估计厂里的员工就不用干别的了,整天回答这个问题就可以了。而且如果有职员外出忘带手机了,更麻烦。最要命的是,职员刚刚告诉你他没有区域使用权,然后立刻又获得了区域使用权,更无法保证这个“禁止老职员来申请区域”的准确性。

  那看看条件2),能否禁止这个相对年长的备注人不去抢占已经备注的年轻备注人?这貌似打破了一个铁律:尊老爱幼。那我们回顾一下这个铁律的由来:最初两个管理员时,通过年龄优先,可以解决两个职员“互锁”的问题。三个管理员时,引入“备注”机制之后,通过“尊老爱幼”的登记规则来“排挤”年轻职员,并取得自己是最年长职员的预判;通过“尊老爱幼”的备注规则,来保证年长职员取得区域使用权。也就是说,我们没有说过“尊老爱幼”的备注规则是用来解决“互锁”问题的。那么,“尊老爱幼”的备注规则到底有没有暗中解决这“互锁”问题,也就是说如果打破这个规则,会不会出现“互锁”问题?“互锁”是指多个职员都成功完成了部分管理员处的备注,但每个职员备注的管理员数量又不够多,不足以让任何一个职员取得区域使用权。最终导致没有职员能对该区域进行卸货。在现有规则下,其实是达不到这种“互锁”状态的。比如:a在张师傅王师傅处成功登记,然后在张师傅处备注;b在王师傅李师傅处成功登记,然后在王师傅处备注;这是c有机会在李师傅处登记然后造成“互锁”么?显然不会,因为c要先在两个管理员处登记成功,才能取得备注权。而c在任意两个管理员处登记之后,他都至少要知道一个备注人信息,要么是a,要么是b,要么是ab。简单说就是,在现有规则下,任何想要备注自己的职员,都要成功登记多数管理员,并且这些管理员目前还没有人备注过。否则,职员要么没有备注权,要么需要去帮别人备注。有了这个规则,就不会出现“互锁”。

  那么允许年长职员修改备注,目的就剩“尊老爱幼”了。在无法“尊老爱幼”和“互锁”问题上的抉择是显而易见的:要优先做到不“互锁”。取消备修改备注这条规则?回顾历史,修改备注还有一个作用,就是让尽可能多的管理员备注一个大家都认同的职员做区域使用人,目的是为了防止有职员离岗后,该职员依然能顺利使用该区域。那就是说修改备注还是有一定作用的。

  分析到这,可以说包括厂长在内的人都已经是一脸懵B了。到底要不要取消修改备注这条规则?我们再回过头看一下最初的问题:ab都分别在张师傅和李师傅处备注,c帮助a在王师傅处备注。之后如果让d帮助b在王师傅处将备注人a修改为b,就会出问题。仔细想仔细想再仔细想:c在帮助a在王师傅处备注之前,c先要在王师傅处登记。登记时,将b在王师傅处的登记记录改为自己(c)。c的这次成功登记,暗示了c的年龄,在目前的所有已经做过备注的备注人的年龄中,是最高的。因为c想要取得(帮助a去备注的)备注权,必须先在大多数管理员处登记成功,而其他职员做过备注的话,势必也在大多数管理员处登记成功过。而此时,c能够在所有职员中胜出,在大多数管理员处登记成功,就说明c一定比目前备注过的备注人年龄都要大。

  这个结论是否可以成为保护a在王师傅处的备注信息的依据?也就是说,保护a的备注不被修改的依据不再是a自己的年龄,而是c的年龄。这样可以保证所有已经做过备注的人(目前只有b)凭着自己的年龄,都无法去修改由c在王师傅处进行的备注(a)。也就是说,c的出现就确定了a是该区域的使用人了,不管后边再出现def。按照这个规则,他们都会认为c所备注的a(而非b),才是应该填写的备注人。

  这样,如果是只有ab的情况,备注填写人都是自己,b依然有年龄优势,可以胜过a。如果出现上面这种有c参与的情况,那么谁是备注填写人,谁的年龄才是修改备注人时的要比较的条件。所以以后除了要记录备注人,还要额外的记录备注人的填写人。


    之后,仓库调配不但没有出现冲突问题,效率也有所提高。厂长很满意,并找了厂里语文最好的员工归纳了以上规则:

1)登记阶段

1.职员 如果需要申请空闲区域,需要去管理员处进行登记,同时还要登记自己年龄。职员要尽力去完成多数管理员处的登记工作;

2.管理员 负责检查登记过程。如果来的职员年龄比当前记录的登记职员年龄小,则不允许其修改登记记录。如果来的职员年龄比记录的登记职员年龄大,则把登记人改为新来的这个职员。并且告诉新来的登记职员,备注人里记录的是哪位职员和哪位职员填写的备注人信息。

2)备注阶段

1.职员 如果能在多数管理员处的成功登记,那么他就可以去他登记过的管理员处添加备注了。如果职员之前登记时,从管理员处得知了其他职员的备注信息。那么,职员需要选一个年龄最大的备注填写人,然后将对应的备注人信息填写到管理员处,并且将填写人改为自己。否则备注人填自己,填写人也设为自己。

2.管理员 查看来填写备注的职员是否比当前记录的登记人年长?如果是,并且来者要填写的备注人的填写人也比之前的备注人的填写人年长,则允许其进行备注人填写。

    不久后,厂长发现有一个Paxos算法好像和厂里的这套规则相似。于是做了一个对比:

1) Prepare阶段(登记阶段)

1. Proposer(职员) 选择一个提案编号n(职员年龄),并将Prepare请求(登记请求)发送给Acceptor(仓库管理员)中的一个多数派(2个管理员)

2. Acceptor(管理员) 收到Prepare(登记请求)消息后,如果提案的编号大于它已经回复的所有Prepare消息(登记请求人的年龄比当前登记在案的人年长),那么Acceptor将上次接受的提案回复给Proposer(管理员将记录在案的备注人和填写人告诉给来登记的职员),并承诺不再回复小于n的提案(将登记信息改为新的职员,不允许年轻的职员修改这个登记记录,并且不允许年轻的备注填写人修改备注人)

2) Accept阶段(备注阶段)

1. Proposer收到多数Acceptor的回复后(职员成功在多数管理员处成功登记后),就进入批准阶段。他要向回复Prepare请求的Acceptors发送accept请求(职员要去他登记成功的管理员处填写备注信息)。包括编号n(备注填写人的年龄)和Prepare阶段决定的value(备注人信息),如果Prepare阶段没有收到value(登记阶段,没发现登记过的管理员处有其它职员做过备注),则自行决定value(在该管理员处填写备注人为自己,填写人为自己)

2. Acceptor 在不违背自己向其它Proposer的承诺的前提下(如果来备注的职员年长于该区域的登记人,或者是本人。并且要填写的备注人的填写人比当前记录的备注人的填写人年长),Acceptor收到accept请求后即接受该请求(允许职员填写备注)。

    总结归纳起来:

    Paxos的目的:选出优先级相对高的Proposer;

    选举的原则:如果没有Proposer,则推选自己;如果发现有了Proposer,则避免再推选新的Proposer,而是在现有的Proposer中,选取优先级相对高的Proposer;

    使用的具体方式是二段提交,在Prepare阶段去淘汰掉低优先级的Proposer,在Accept阶段去确定高优先级的Proposer


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值