分布式系统中的经典思想实验——两将军问题和拜占庭将军问题

文章目录

    • 一、两将军问题
      • 1.1 问题描述
      • 1.2 深入理解两将军问题
      • 1.3 实验结论
    • 二、拜占庭将军问题
      • 2.1 问题描述
      • 2.2 深入理解拜占庭将军问题
      • 2.3 解决方案
    • 三、两将军和拜占庭问题的关系
      • 3.1 区别和联系
      • 3.2 应用与现实意义
    • 参考资料

一、两将军问题

1.1 问题描述

两将军问题描述的是两个将军(或两支军队)通过不可靠的通信渠道(如信使)来协调攻击的情景。

背景:两支由不同的将军领导的军队,正准备进攻一座坚固的城市。军队在城市附近的两个山丘扎营,中间有一个山谷将两个山丘隔开,两个将军交流的唯一方法是派遣信使穿越山谷。然而,山谷被城市的守卫者占领,并且途经该山谷传递信息的信使有可能会被俘虏。他们必须同时攻击才能取胜。

问题:信使有可能被敌人拦截,导致消息无法到达。即便B收到消息,B回复的确认信息也可能被拦截。这导致将军A无法确定B是否收到了消息并同意攻击,反之亦然。

请添加图片描述

1.2 深入理解两将军问题

这个问题实质上描述的是:

  • 通信不可靠:在不可靠的通信环境下,双方无法确保消息被准确接收。
  • 共识难题:无法保证双方在同一时间达成一致的决策。

两将军问题强调了在不可靠通信环境下达成一致的困难,这在分布式系统的消息传递、确认和重试机制中有所体现。

1.3 实验结论

两将军问题被证明无解,计算机科学家们仍找到了工程上的解决方案,例如传输控制协议(TCP)的“三次握手”机制。

这个思想实验表明,在分布式系统中,一个节点无法直接确认另一个节点的状态,必须通过发送信息来交流。类似于人类交流,我们只能通过语言、文字或肢体语言来传达想法。

二、拜占庭将军问题

2.1 问题描述

拜占庭将军问题是两将军问题的扩展,涉及多个将军(或节点),其中一些可能是恶意的(即“拜占庭将军”)。

背景:多个拜占庭将军各率领一支军队,想要占领一座防守坚固的城市,将军们还是只能通过信使进行交流。为了简化问题,将各支军队的行动策略限定为进攻或者撤离两种。因为部分军队进攻、部分军队撤离可能会导致灾难性后果,所以各位将军必须通过投票来达成一致的策略,即所有军队一起进攻或者所有军队一起撤离。但其中一些将军可能是叛徒,会传递虚假信息以扰乱决策。

问题:如何确保所有忠诚的将军在存在恶意将军的情况下,能够达成一致的决策。

请添加图片描述

2.2 深入理解拜占庭将军问题

这个问题实质上描述的是:

  • 恶意节点:系统中存在恶意节点,会故意传递错误信息。
  • 共识协议:需要设计能够容错的共识协议,确保即使有恶意节点,也能保证忠诚节点达成一致。

拜占庭将军问题则进一步探讨了在存在恶意节点时的容错机制,这对于设计健壮的分布式系统(如区块链和分布式数据库)至关重要。

2.3 解决方案

拜占庭将军问题的解决方案主要集中在设计能够容忍拜占庭错误(恶意或故障节点)的共识协议。以下是几种主要的拜占庭容错(Byzantine Fault Tolerance, BFT)协议:

  • Practical Byzantine Fault Tolerance (PBFT)
  • Paxos
  • Raft
  • Tendermint

三、两将军和拜占庭问题的关系

3.1 区别和联系

特性两将军问题拜占庭将军问题
节点数量两个节点多个节点
节点类型都是忠诚节点可能有恶意节点
通信问题通信渠道不可靠,消息可能丢失存在恶意节点传递错误信息,消息可能被篡改
共识难度确保两个节点在不可靠通信下达成一致在存在恶意节点的情况下达成一致
解决方案没有通用解法(理论上无解)拜占庭容错协议(如Paxos、Raft)

3.2 应用与现实意义

两将军问题强调了在不可靠通信环境下达成一致的困难,这在分布式系统的消息传递、确认和重试机制中有所体现。

拜占庭将军问题则进一步探讨了在存在恶意节点时的容错机制,这对于设计健壮的分布式系统(如区块链和分布式数据库)至关重要。

参考资料

《深入理解分布式系统 唐伟志》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/28317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

中国成熟工艺晶圆代工领域激烈的价格战即将落幕

据《经济日报》报道,中国第二大晶圆代工厂华虹半导体计划在下半年提高代工价格约10%。这标志着长达两年的成熟工艺代工价格下滑趋势的终结,意味着行业正从调整阶段走出,迈向更健康的发展轨道。受此影响,专注于成熟工艺的台湾晶圆代…

el-pagination 切换分页条数,会出现两次请求

文章目录 前言一、问题展示二、源码展示 前言 继上一次发现el-pagination在删除的时候pageNum不更新的问题。这次又发现了,切换分页条数,会出现两次请求。网上有很多解决方案,我就不多说了,我就简单记一下为啥会出现两次请求的问…

21. 第21章 算法分析

21. 算法分析 这个附录选自OReilly Media出版的Alen B.Downey的Think Complexity(2012)一书. 当你读完本书之后, 可能会像继续读读那本书.算法分析是计算机科学的一个分支, 研究算法的性能, 尤其是他们的运行时间和空间需求. 参见http://en.wikipedia.org/wiki/Analysis_of_al…

Vue前端通过Axios的post方式传输数据,后端为什么一直接收的值是null?

沃靠!这个细节太细了,搞了我两个多小时才找到这个bug。 一、 首先官方文档给我的post请求的例子是这样的: axios.post(/user, {firstName: Fred,lastName: Flintstone}).then(function (response) {console.log(response);}).catch(function (error) {console.log(error);})…

Linux下的抓包工具使用介绍

应用层 传输层 网络层 数据链路层 物理层 1)tcpdump(传输/网络层) tcpdump -i eth0 tcpdump -i eth0 -vnn -v:显示包含有TTL,TOS值等等更详细的信息 -n:不要做IP解析为主机名 -nn:…

go协程的栈

go协程的栈默认有多少 Go 协程(goroutine)的栈初始大小并不是固定的多个栈,而是有一个默认的初始大小,这个大小在不同的 Go 版本中可能会有所不同。 目前,Go 1.17 版本中,默认的栈大小是 8KB。 关键点在于…

【Python的基本语法】

Python的基本语法包括以下几个方面: 注释: 注释以 # 开始,用于在代码中添加说明性文字,不会被解释器执行。 # 这是一个注释变量: 在Python中,变量不需要显式声明,直接通过赋值来创建。变量的命名…

RK平台Android单独编译内核

介绍如何在android平台下单独编译内核: 方式1(推荐): 在执行单独编译之前,必须有过整体编译Android,之后就可以单独编译内核开发,减少编译时间,具体操作如下: #!/bin/sh make ARCH=arm64 CC=../prebuilts/clang/host/linux-x86/clang-r383902b/bin/clang \ LD=.…

Shell 学习笔记 - 变量的类型 + 变量的赋值

1.6 Shell 变量的类型 Shell 变量分为四类,分别是 自定义变量环境变量位置变量预定义变量 根据工作要求临时定义的变量称为自定义变量; 环境变量一般是指用 export 内置命令导出的变量,用于定义 Shell 的运行环境,保证 Shell …

Vue51-插件

一、插件的定义 vue里面的插件,类似于游戏的外挂。 vue中插件的本质:一个对象,里面必须包含install方法。 二、插件的使用 2-1、创建一个插件js文件(写在src中plugins.js) 2-2、应用插件:Vue.use(插件) …

外键的基本概念

外键的基本概念 外键(FOREIGN KEY):外键是一个或多个列,其值必须在另一个表中对应列的值中存在。外键用于维护两个表之间的关系,并确保引用的完整性。 外键在示例表结构中的应用 假设外键约束如下: FOR…

vue框架学习-----vue简介vue.js安装第一个vue程序部分vue指令

什么是vue? Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面&#xf…

微信小程序获取用户信息流程

微信小程序获取用户信息的流程可以分为以下几个步骤,下面将结合参考文章中的信息进行详细解释: 配置权限: 在小程序的app.json文件中配置scope.userInfo,以确保小程序可以请求用户信息授权。创建触发授权的交互元素: …

大学生计算机基础题(一)

嗨,大家好,我是异星球的小怪同志 一个想法有点乱七八糟的小怪 如果觉得对你有帮助,请支持一波。 希望未来可以一起学习交流。 一、单选题(20小题,共30分) 1、下列关于列表的说法中,错误的是…

机器真的能思考、学习和智能地行动吗?

In this post, were going to define what machine learning is and how computers think and learn. Were also going to look at some history relevant to the development of the intelligent machine. 在这篇文章中,我们将定义机器学习是什么,以及…

【Java03】Java中数组在内存中的机制

1. 内存中的数组 Java中的数组是一种引用类型,数组变量(引用)和数组元素在内存中是分开的。 Java中的数组变量其实就是指针。 如果想要访问数组元素,只能通过这个数组的引用变量(指针)来访问。 实际数组对…

杀戮尖塔游戏

Java 你正在玩策略卡牌杀戮尖塔游戏,轮到你出牌,手里N张攻击卡,每张都需要花金币coust[i]和获得伤害dmager[i]。 最多花3金币能造成的最大伤害是多少? class Solution{public int calc(int[] cost, int[] dmager, N){int[][] db …

【stm32-新建工程】

stm32-新建工程 ■ 下载相关STM32Cube官方固件包(F1,F4,F7,H7)■ 1. ST官方搜索STM32Cube■ 2. 搜索 STM32Cube■ 3. 点击获取软件■ 4. 选择对应的版本下载■ 5. 输入账号信息■ 6. 出现下载弹框,等待下载…

刚入职,写接口用了PUT和DELETE方法,结果被同事喷了,感觉自己被针对了

事情是这样,某社交平台上有个兄弟发帖,说自己刚入职国企,写了个借口,用了PUT和DELETE方法,前段说不能用这两个,这位仁兄感觉很委屈,特地发帖吐槽。 其实站在安全的角度来说,真没冤枉…

MySQL 示例数据库大全

前言: 我们练习 SQL 时,总会自己创造一些测试数据或者网上找些案例来学习,其实 MySQL 官方提供了好几个示例数据库,在 MySQL 的学习、开发和实践中具有非常重要的作用,能够帮助初学者更好地理解和应用 MySQL 的各种功…