大话分布式环境接口幂等性与一致性解决方案

小陈是IT国的一个小商贩,刚开了一个布庄和一个制衣店,生意还不错,由于刚刚开业,这布庄和制衣店的账房都由马掌柜,比如说十八里店的张员外要定制一个六十大寿的锦袍,马掌柜就在布庄的库存账簿里减去一匹布在制衣店的出货账簿里加上一件衣服,如果说由于制衣店的伙计实在忙不过来把制衣订单给退了回来,马掌柜会再把布庄的账簿加上一匹,从开始到现在是一直没有出错过。
上述就是单机事务保证一致性,马掌柜就是事务

由于这衣服款式新颖,质量过硬,这名声很快就传遍了十里八村,附近的人但凡要做衣服都会来到小陈的布庄和制衣店,更有从大老远赶来的客商批量定制,由于订单太多,小陈原先的小店无法满足了,于是就把布庄和制衣店分别租了个更大的店铺,各自成立了一个账房,马掌柜在布庄,制衣店又请了个牛掌柜。刚开始时运营的很好,但是有一天突发个情况,事情是这样的,李庄的钱财主要给自己的妻妾们定几套冬衣,就拆个杂役去布庄说这事,这个杂役在布庄下了订单刚出门就被他弟弟叫住了,说他老娘生病了,这个杂役很着急,没来得及回去禀报已经下好单就拐会老家了,这老家离这80里远来回得两天,钱财主见杂役迟迟未归,以为半路出啥事了就又拆个杂役去下单,并顺便报官说丢了个人,于是这个杂役又来到布庄下了单,等衣服做好了小陈差人把衣服送到老钱的府上并收下钱,到钱府后老钱说不对啊,我就一人定了一套,你怎么给我送来两套呢,死活不要第二套,于是只能把多余的一批给拿回来了,小陈想这样不是个办法,万一哪天再来这种情况,岂不是又白瞎一套,况且我这生意好的正常订单都做不过来,还浪费时间做这个没用的订单,岂不是很亏,反正我这生意好,典型卖方市场,干脆我定个规则,以后但凡要来我这做衣服的,无论哪家,先到我这排队,等轮到谁了再派伙计给排队的人家送去一个号,回头让各家拿着号来布庄定制衣服,布庄的掌柜按号记录,如果已经有这个号的订单,则不用再次记录,这就避免了钱财主这种情况。
上述就是接口幂等性

旧的问题刚解决,新的问题又来了,一个订单要一匹布做一批衣服,布庄掌柜支出一匹布,并记录在帐,差伙计拿到制衣店,当时牛掌柜不在,于是这伙计就把订单和布放到柜台,并告诉制衣店里的一个伙计等牛掌柜回来别忘了记录一下,再把衣服给做出来。制衣店的伙计答应了然后忙自己的事去了,由于生意太好,伙计太忙,转眼就把这事给忘了,并且恰巧这匹布被收拾屋子的小工收起来放到柜台下一个不怎么用的箱子里了。等到收衣服的日子到了,老板过来取衣服发现没有,在布庄的帐上查到了日期和订单,确定没问题,又去制衣店,一查没有记录,随后集合伙计问这事,这才找到那匹布,才理清事情的来龙去脉。
上述就是分布式系统一致性问题,没有分布式事务导致不一致产生

经历这事之后,小陈想到一个办法,这个布庄不能只有一个账簿了,它得有两个,一个记录布的支出,另一个记录制衣店要确认的任务,每次有订单来到先记录布的支出,再在另一个账簿上记录制衣店的一条记录,如果马掌柜记录的两个账本不一致,那么就是马掌柜的问题,要扣工钱,由于马掌柜怕扣工钱,因此会保证两个账本的一致性。记完后,布庄的伙计去制衣店下单时拿着第二个本帐,只有等到制衣店的牛掌柜确定记完制衣店的帐,并且再把拿过去的账本后边填上确定收单这才算完,如果说牛掌柜因为事没在,或者说今天今天已经满工没法制作了,那伙计需要把布匹和账本拿回布庄,等第二天再去,或者直接把布庄之前支出的那匹布的记录给抹掉,这样就不会差帐了。
上述就是两个事物保证分布性系统的事务一致性,马掌柜为一个事务,牛掌柜为第二个事务。

但是每来一个订单都让伙计带着账本跑一趟显然会耽误布庄接单的量,因此小陈决定,两个账本都记录,但是不是每来一次都往制衣店跑一趟,而是到多少比活着是到晚上一次拿上布匹和账本去制衣店确认,只要最终不出差错就可以。
上述就是最终一致性

这么改良之后啊小陈的布庄和衣长的帐再也没有差过,生意也是越做越大。

如果您喜欢欢迎转载,更多精彩内容请关注微信公众号 IT农厂【ITFF01】


大话分布式环境接口幂等性与一致性解决方案