暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

分布式系统-秒杀系统架构设计】第三章 paxos算法(续第二章节)

也输思雪计算机之路 2021-10-18
442

昨天我们聊了下paxos一致性协议的基本概念,并讲了一个例子来让大家好理解。计算机世界其实就是现实世界的抽象,所以你可以利用现实世界某些东西来对应,学过数学建模的朋友们应该会大有体会。

一 活锁

昨天的牛家弯女儿嫁人的例子讲完了,那我们来想想,这个有问题吗?

    想一下,要想娶牛家的女儿,有两步,先提亲,再来订亲。

    A,如果那个女儿已经订了亲了,那么有人来提亲的话,钱多则接收,并且告诉他“女儿已经许配出去了,而且对方公子带了辆什么什么车”,那么这人也只有去买一样的车(也就是虽然都被接收了,但数据是一致的,也即是这人在学习“对方公子”)

    B,如果那个女儿还没订亲,那么有人来提亲的话,钱多则接收,等他来提亲。

     A情况不会有问题,也是我们想要的结果,也即是为了让数据一致,但B情况就有问题了。

     我们以昨天的牛家弯例子“第五天”继续谈,假设萧公子的媒人萧大妈拿了9万聘礼去提亲,提亲成功了(全票通过),然后他打算第六天来订亲,结果不巧的是,第五天他媒人提亲结束刚走,又来了一个赵公子的媒人赵大妈来提亲,聘礼10万,那么等第六天萧公子再来提亲时,也会被告知“呵呵,红本本记下的是聘礼10万,不是你萧公子的9万,走人吧,有人给了10万呢”,那么萧公子也会被拒绝(曾公子也会被拒绝),那就只有赵公子来提亲才会成功了。那也不一定,要是有人在赵公子来订亲前,又带着更高的聘礼提亲,那赵公子也就会被拒绝。就这样一直循环,最终没人成功。

      上面这种情况就是“活锁”(死锁应该不模糊),与死锁不同的是,死锁是相互竞争资源而都拿不到自己要的,活锁是没有竞争,是“谦让”造成的(后续单开章节细讲)

       二 解决方案

  1.  被拒绝返回第一阶段(提亲)的都加一个随机等待时间,等待时间结束才能来提亲 

  2.  设置一个超时时间,时间到了就不再接收“提亲”了(直接拒绝,另外这里提示下一次paxos 只能同步一个值,也即是一个paxos instance只能使一个值达到一致!!!)  ,当然也可以设置最大的接收提亲人数来限制

  3. 选一个代表,统一来提亲订亲,类似于一个代理

三 总结

这两章节主要讲了paxos一致性协议,paxos协议更偏向于理论,实现起来非常困难,所以一般会借鉴这种思想来改进,也就成了现在的改进版本的一致性协议算法。所以,如果你觉得看起来很复杂,那么就当听了个故事吧,记住两个点先“提亲”再“订亲”来实现数据同步操作,记住这思想就行了,比如C#的ADO.net操作数据库就是两步走,先prepare,再commit。再比如pdo prepare等等。

ps:封面就是Leslie Lamport

文章转载自也输思雪计算机之路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论