高级分布式系统-第6讲 分布式系统的容错性--可靠的组通信

可靠的组通信

组内通信最好是每个进程之间都建立点到点的通信, 但实际中这样的组织结构不是有效的, 因为会浪费很大的通信带宽。

在平等组中, 多播是主要的组织结构。 但多播是具有同步性质的容错结构, 并不适用拜占庭模型

多播服务需要保证消息被传送给进程组中的所有成员, 但由于进程成员管理的动态性( 创建、 删除、 加入、 离去等) , 可靠多播的实现是十分困难的。

可靠的组通信, 就是指发送到一个组的消息被传递给该组的每个成员。 可分为哪两类: 存在故障进程时的可靠通信与假定所有进程都正确的操作时的可靠通信。

假定所有进程都不会失败时的可靠通信

在这种情况下, 如果通信期间不会有进程加入或离开组, 那么可靠多播就简单意味着每个消息都应该被传递到组的每个当前成员处。 实现这种简单的可靠多播的一种方法就是为每个多播消息分配一个序列号。

假定所有进程都不会失败时的可靠通信

简单的可靠多播存在一个问题: 如果接受者众多, 在每个接收者都要回复确认信息时, 那么发送者可能被大量的反馈消息淹没而产生反馈拥塞。

解决方法: 采用否定确认的消息机制, 接收者不对消息接收进行反馈, 而是只在通知发送者消息丢失时才返回一个反馈消息。

缺点: 发送者不得不永远在历史缓存器中保留消息。 因为发送者永远不会知道消息是否已被传送到所有的接收者, 所以总是需要准备处理来自接收者的要求重发旧消息的请求。

两种具体方案: 无等级的反馈控制和分等级的反馈控制

无等级的反馈控制

一个没有接收到消息m的接收者R延迟一个随机的时间然后发送反馈消息。

如果同时有其他对m的重发请求到达R, 那么R就抑制自己的反馈, 因为它知道m会短时间内重发。

分等级的反馈控制

如果一个发送者需要向一个非常大的接收组进行多播, 可将接收组分为多个子组, 组织成树的形式。

每个子组制定一个本地协调者, 它负责处理子组中包含的接收者的重发请求。 本地协调者具有自己的历史缓存器。

存在进程失败情况下的可靠通信

如果多播通信满足下列两个条件, 则称为原子多播( atomicmulticast) :

( 1) 分布式系统中保证消息要么被发送给所有的进程, 要么就不向任何一个进程发送。

( 2) 所有的消息都按照相同的顺序发送给所有的进程。

在上述两个机制中, 第( 1) 个机制通常由虚拟同步完成, 第( 2) 个机制由消息排序实现。

虚拟同步

多播消息m唯一地跟它应该传送的一个进程表相关联。 这个表对应一个包含组中进程的组视图。 列表中的每个进程都具有相同的视图, 即它们都同意m应该被传送给它们中的每一个而且不被传送到别的进程。

进程的加入或离开会影响到组视图的构成。

如果消息的发送者在多播期间崩溃, 那么消息或者被投递给所有剩余的进程, 或者被每个进程忽略。 具有这种属性的可靠多播被称为虚拟同步

虚拟同步的原理是所有多播都在视图改变之间进行。 换句话说, 视图改变作为一个屏障, 不能跨越它进行多播。

例子: 下图所示4个进程。 在某个时刻, 进程P1加入了一个进程组, 然后这个进程组就由P1、 P2、 P3和P4组成。 在多播了一些消息之后, 进程P3崩溃了, 但是在崩溃之前它成功地将消息多播到了进程P2和P4, 但是没有多播到P1。 此时, 虚拟同步的机制保证这个消息不会传送至进程, 这就有效地建立起一种情况, 使得在P3崩溃之前的消息像是从来没有被发送( 被丢弃) 。

消息排序

        多播的消息排序种类:

        不排序的多播

        FIFO顺序的多播

        按因果关系排序多播

        全序多播

不排序的多播

FIFO顺序的多播

FIFO顺序的多播: 同一进程传送的消息有顺序约束, 不同进程传送的消息顺序没有约束。

按因果关系排序多播

按因果关系排序多播: 如果消息m1和m2之间存在因果关系, 即m1导致了m2的产生, 那么无论它们是否由同一个发送者多播的, 每个接收者的通信层都应该在接收m1之后传送m2。

全序多播

不论消息传送是无序、 FIFO顺序还是因果关系排序,都需要在传送消息时, 对所有的成员按照相同的次序来传送。

六种不同的虚拟同步可靠多播

提供了全序的消息传送的虚拟同步可靠多播称为原子多播

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis命令 - Strings命令组常用命令

1、Set命令 SET key value [EX seconds] [PX milliseconds] [NX|XX]1.1 参数说明: EX seconds: 设置key的过期时间,单位时秒PX milliseconds: 设置key的过期时间,单位时毫秒NX: 只有key不存在的时候,才会设置key的值XX: 只有key…

GitHub注册新账号的操作流程(详细)

目录 第一步 进入官网,点击右上角的"Sign up" 第二步 输入email地址 第三步 设置密码 第四步 输入昵称 第五步 根据个人喜好决定要不要接收GitHub的邮件推送。然后回答他们的验证问题 第六步 输入验证码 我在注册github账号时遇到过一些阻碍&#x…

Web前端 ---- 【Vue3】ref和reactive实现响应式的区别和联系

目录 前言 setup ref 基本数据类型 对象形式 reactive ref和reactive的区别与联系 前言 本文介绍函数ref和函数reactive实现响应式 setup 在介绍ref和reactive之前,先介绍setup,vue3新引入的配置项。在该配置项中,在vue2中的data、methods、comput…

VS游戏打包教程

我用得天天酷跑小游戏做的例子 1:安装打包插件 2:在解决方案里新建一个项目 3:新建一个setup项目 4:界面如下(通过右键folder,可以创建folder目录和输出) 5:素材文件 6:素材放完了就项目输出 7:创建快捷方式 右键这个主输出选择第一个create shortcut 8:将这个快捷方式,拖到,…

MAVROS与机载电脑Jetson nano通信

简介:MAVROS和Jetson nano通信,设置飞控参数和MAVROS文件,实现飞控和机载电脑的通信。MAVROS相当于PX4飞控中的MAVLINK模块。MAVROS将话题转为MAVLINK格式消息发送给飞控,飞控中的MAVLINK模块将MAVLINK格式消息转化为uORB消息给PX…

MYSQL分表分库 详解

目录 一、垂直拆分于水平拆分的区别? 垂直拆分 水平拆分 二、分表分库有哪些策略? Hash分片策略 枚举分片策略 日期分片策略 范围分片策略(用的较多) 三、分表分库之后,如何查询的呢? 四、分表分…

009集:open( )、write( )、close( )函数读写文件实例—python基础入门实例

一般来说,计算机文件可以分为两类:文本文件和二进制文件。大多数Windows文本文件使用ANSI、OEM或者Unicode编码。常见的文本文件有:大多数Windows文本文件使用ANSI、OEM或者Unicode编码。常用的文本文件格式有ASCII、MIME、*.txt等&#xff0…

【Linux 内核源码分析】进程调度 -CFS 调度器

Linux调度器 Linux内核调度器是负责决定哪个进程在何时执行的组件。它管理着CPU资源的分配和任务的调度,以确保系统资源的合理利用和任务的高效执行。Linux内核中常见的调度器有多种,包括经典的O(1)调度器、CFS(Completely Fair Scheduler&a…

大模型实战笔记04——XTuner 大模型单卡低成本微调实战

大模型实战笔记04——XTuner 大模型单卡低成本微调实战 1、Finetune简介 2、XTuner 3、8GB显存玩转LLM 4、动手实战环节 注: 笔记内容均为截图 课程视频地址:https://www.bilibili.com/video/BV1yK4y1B75J/?spm_id_from333.788&vd_source2882acf…

Flink(十二)【容错机制】

前言 最近已经放假了,但是一直在忙一个很重要的自己的一个项目,用 JavaFX 和一个大数据组件联合开发一个功能,也算不枉我学了一次 JavaFX,收获很大,JavaFX 它作为一个 GUI 开发语言,本质还是 Java&#xff…

嵌套的CMake

hehedalinux:~/Linux/multi-v1$ tree . ├── calc │ ├── add.cpp │ ├── CMakeLists.txt │ ├── div.cpp │ ├── mult.cpp │ └── sub.cpp ├── CMakeLists.txt ├── include │ ├── calc.h │ └── sort.h ├── sort │ ├── …

Spring之AOP源码(一)

文章目录 一、动态代理1. 概念2. Cglib动态代理的使用3. JDK动态代理的使用 二、SpringAOP1. 简介2. Spring AOP使用 一、动态代理 1. 概念 动态代理(Dynamic Proxy)是一种在运行时动态生成代理对象的技术。它是一种设计模式,用于在不修改原…

Web实战丨基于django+html+css+js的电子商务网站

文章目录 写在前面实验目标需求分析实验内容安装依赖库1.登陆界面2.注册界面3.电子商城界面4.其他界面 运行结果写在后面 写在前面 本期内容:基于DjangoHTMLCSSJS的电子商务网站 实验环境: vscode或pycharmpython(3.11.4)django 代码下载地址&#x…

Web自动化测试,一定得掌握的 8 个核心知识点

使用 cypress 进行端对端测试,和其他的一些框架有一个显著不同的地方,它使用 javascript 作为编程语言。传统主流的 selenium 框架是支持多语言的,大多数 QA 会的python 和 java 语言都可以编写 selenium 代码,遇到需要编写 js 代…

距离美赛还有20天,不要忘了阅读往年获奖论文(附04-23年美赛获奖论文)

之前发了很多数模相关的知识,受到了一些人的关注,也有很多人私下问我,距离美赛还有20几天了,还来不来得及。 对此我想说, 来不来得及重要吗? 你名都报了,钱也交了,还是笔不小的钱…

猫狗大战(猫狗识别)

1.问题简介 1.1问题描述 在这个问题中,你将面临一个经典的机器学习分类挑战——猫狗大战。你的任务是建立一个分类模型,能够准确地区分图像中是猫还是狗。 1.2预期解决方案 你的目标是通过训练一个机器学习模型,使其在给定一张图像时能够准…

【模块系列】STM32BMP280

前言 最进想练习下I2C的应用,手上好有BMP280也没用过,就看着机翻手册和原版手册,开始嘎嘎写库函数了。库的命名应该还1是比较规范了吧,就是手册对于最终值的计算方式很迷糊,所以现在也不能保证有可靠性啊,大…

关于运维·关于数据库面试题

目录 一、数据库类型 二、数据库引擎 三、mysql数据库类型 四、mysql的约束添加 五、主从复制原理 六、主从方式有几种 七、mysql主从数据不一致的原因 八、mysql的优化 九、什么是事务的特征 十、数据库读写分离的好处 十一、怎样优化sql语句 十二、mysql的同步方…

基于MAP算法的Turbo译码 -- 公式推导

到此为止,讲完了turbo译码器的子译码器基于MAP算法的译码过程。但在实际使用中,很少直接使用MAP算法进行译码。而是使用改进的LOG-MAP和MAX-LOG-MAP算法进行译码,因此译码的整体流程,包括外信息的计算以及先验信息的获取等。都在后…

openai自定义API操作 API (openai.custom)

OpenAI 提供了一个自定义 API,允许开发者通过编程方式与 OpenAI 的 AI 模型进行交互。使用这个 API,你可以执行各种任务,例如文本生成、推理和翻译等。 以下是使用 OpenAI 自定义 API 的基本步骤: 创建 API 密钥:首先…