用三国杀讲分布式算法,舒适了吧?
《三国杀》是一款热门的卡牌游戏,结合中国三国时期背景,以身份为线索,以卡牌为形式,益智休闲,老少皆宜。
CAP 理论和 BASE 理论的大致含义。但认真去看分布式算法的真的很少,原因有三:担心算法过于复杂,所以花的时间很少。 网上的资料能用大白话将分布式算法讲清楚的比较少。 学习分布式算法没有一条清晰的路线。
学习路线
四大基础理论
拜占庭将军问题 CAP 理论 ACID 理论 BASE 理论
八大分布式协议和算法
Paxos 算法 Raft 算法 一致性 Hash 算法 Gossip 协议算法 Quorum NWR 算法 FBFT 算法 POW 算法 ZAB 协议
拜占庭将军问题
拜占庭位于如今的土耳其的伊斯坦布尔,是东罗马帝国的首都。由于当时拜占庭罗马帝国国土辽阔,为了达到防御目的,每个军队都分隔很远,将军与将军之间只能靠信差传消息。在战争的时候,拜占庭军队内所有将军和副官必须达成一致的共识,决定是否有赢的机会才去攻打敌人的阵营。但是,在军队内有可能存有叛徒和敌军的间谍,这个就是拜占庭容错问题。因为它很好地抽象出了分布式系统面临的共识问题。 上面提到的 8 种分布式算法中有 5 种跟拜占庭问题相关,可以说弄懂拜占庭问题对后面学习其他算法就会容易很多。三国杀身份牌
主公

忠臣

反贼

内奸

还原拜占庭问题

一方选择撤退
刘备决定进攻,通过信使告诉曹操和孙坚进攻。 曹操决定撤退,通过信使告诉刘备和孙坚撤退。 孙坚决定进攻,通过信使告诉曹操和刘备进攻。

内奸登场-撤退
刘备决定进攻,通过信使告诉曹操和孙坚进攻。 曹操决定撤退,通过信使告诉曹操和孙坚撤退。 孙坚决定撤退,通过信使告诉曹操和刘备撤退。

内奸使诈-一进一退
刘备决定进攻,通过信使告诉曹操和孙坚进攻。 曹操决定撤退,通过信使告诉曹操和孙坚撤退。 孙坚作为内奸使诈,通过信使告诉刘备进攻,告诉曹操撤退。

拜占庭问题解法
解法原理
第一步:先发送作战信息的将军我们把他称为指挥官(袁绍),另外的将军我们称作副官(刘备,曹操,孙坚)。 第二步:指挥官将他的作战信息发送给所有的副官。 第三步:每一位副官将从指挥官处收到的作战信息,作为自己的作战指令;假如没有收到指挥官的作战信息,将把默认的撤退作为作战指令。

第一轮指挥官(袁绍)已经发送指令了,现在就需要刘备、曹操、孙坚依次作为指挥官给其他两位副将发送作战信息。 然后这三位副将按照少数服从多数的原则,执行收到的作战指令。
孙坚使诈 - 两撤退

孙坚使诈 - 一进一退

孙坚作为指挥官

曹操向刘备和袁绍发送进攻指令。 刘备向曹操和袁绍发送进攻指令。 袁绍向曹操和刘备发送撤退指令。

小结
如果叛将人数为 m,将军数 n >= 3m + 1,那么就可以解决拜占庭将军问题。 前提条件:叛将数 m 一致,需要进行 m + 1 轮的作战协商。
拜占庭解法二-签名
签名无法伪造,对签名消息的内容进行任何更改都会被发现。 任何人都能验证将军签名的真伪。
总结
将军对应计算机节点。 忠臣的将军对应正常运行的计算机节点。 叛变的将军对应出现故障并会发送误导信息的计算机节点。 信使被杀对应通讯故障、信息丢失。 信使被间谍替换对应为通讯被恶意攻击、伪造信息或劫持通讯。
BFT)。FBFT 算法,PoW 算法,当然不会在这篇中去讲这些算法,后续再讲解。一口吃不了大胖子~CFT 算法就是解决分布式系统中存在故障,但不存在恶意节点的场景下的共识问题。简单来说就是可能因系统故障造成丢失消息或消息重复,但不存在错误消息、伪造消息。对应的算法有 Paxos 算法、Raft 算法、ZAB 协议。后续讲解~有道无术,术可成;有术无道,止于术
欢迎大家关注Java之道公众号
好文章,我在看❤️
评论
