Gossip协议:分布式系统中的“八卦”传播艺术

在这里插入图片描述

目录

    • 一、 什么是Gossip协议?
    • 二、 Gossip协议的应用 💡
    • 三、 Gossip协议消息传播模式详解 📚
    • 四、 Gossip协议的优缺点
    • 五、 总结:

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!

🌟了解 Raft 算法 请看 : Raft 算法详解,比 Paxos 更简单

其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等

如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning

一、 什么是Gossip协议?

想象一下:

  • 场景: 你在一个大型聚会上,想告诉所有人一个重要消息,比如“明天放假!🎉”
  • 传统方式: 你挨个走到每个人面前,告诉他们“明天放假!🎉” (效率太低,人越多越慢 🐌)
  • Gossip方式: 你随机找到几个人,告诉他们“明天放假!🎉” 然后,这些人再随机告诉他们认识的其他人。 这样,消息就像流言蜚语一样,慢慢地在整个聚会上传播开来。

Gossip协议,也叫流言协议,就是模仿这种流言传播的方式。 它是一种去中心化的通信协议,没有中心节点,每个节点都平等地与其他节点通信,最终将信息传播到整个网络。 🌐

正式定义:

Gossip协议是一种基于节点随机选择的通信协议,用于在分布式系统中传播信息。每个节点周期性地选择一些其他节点,并与它们交换信息。通过这种方式,信息可以在整个网络中快速、可靠地传播。 🚀

二、 Gossip协议的应用 💡

Gossip协议非常适合用于构建大规模、去中心化、容错性强的分布式系统。 常见的应用场景包括:

  1. 成员管理(Membership Management):

    • 场景: 一个集群中有成百上千个节点,需要知道哪些节点是活着的,哪些节点挂了。 🧑‍🤝‍🧑
    • Gossip应用: 每个节点定期向其他节点“八卦”自己还活着的消息(心跳)。 如果一个节点长时间没有收到某个节点的心跳,就认为该节点已经失效。 💔
    • 例子: Apache Cassandra、Consul等。
  2. 数据同步(Data Synchronization):

    • 场景: 多个节点存储相同的数据副本,需要保证数据的一致性。 🗄️
    • Gossip应用: 当一个节点的数据发生变化时,它会向其他节点“八卦”这个变化。 其他节点收到消息后,会更新自己的数据。 🔄
    • 例子: Amazon DynamoDB、Redis Cluster等。
  3. 故障检测(Failure Detection):

    • 场景: 快速发现集群中的故障节点。 🚨
    • Gossip应用: 节点之间互相“八卦”其他节点的状态。 如果一个节点被多个节点报告为故障,那么它就被认为是真的故障。 ❌
  4. 路由信息传播(Routing Information Propagation):

    • 场景: 在P2P网络中,节点需要知道如何找到其他节点。 🗺️
    • Gossip应用: 节点之间互相“八卦”自己知道的路由信息。
  5. 配置信息同步(Configuration Synchronization):

    • 场景: 多个节点需要保持配置信息的一致性。 ⚙️
    • Gossip应用: 当配置信息发生变化时,一个节点会向其他节点“八卦”这个变化。

三、 Gossip协议消息传播模式详解 📚

Gossip协议的核心在于消息的传播方式。不同的传播模式在效率、可靠性、资源消耗等方面各有侧重。以下是几种常见的Gossip协议消息传播模式的详细解释:

  1. Anti-Entropy (反熵) 🔄
  • 原理:
    • 两个节点(比如A和B)定期进行数据交换,交换彼此拥有的所有数据。 🤝
    • A和B比较各自的数据,找出对方没有的数据,然后互相更新。 🔍
    • 这个过程就像两个房间互相交换垃圾,然后各自清理,最终达到干净的状态。 🧹
  • 流程:
    1. 节点A选择节点B进行通信。
    2. A和B交换各自的数据集(例如,所有键值对)。
    3. A比较自己的数据集和B的数据集,找出B缺少的数据,然后将这些数据发送给B。
    4. B比较自己的数据集和A的数据集,找出A缺少的数据,然后将这些数据发送给A。
    5. A和B各自更新自己的数据集,使其与对方保持一致。
  • 特点:
    • 保证最终一致性: 确保所有节点最终拥有相同的数据。 ✅
    • 数据量大: 每次交换的数据量很大,因为需要交换所有的数据。 📦
    • 效率低: 由于数据量大,交换过程比较耗时。 🐌
    • 简单可靠: 实现简单,可靠性高,因为会完整地同步数据。 👍
  • 适用场景:
    • 数据量较小,一致性要求高的场景。
    • 例如,小型配置信息的同步。
  • 举例:
    • 假设节点A有数据{key1: value1, key2: value2},节点B有数据{key2: value2, key3: value3}。
    • A和B交换数据后,A会发现B缺少key1,B会发现A缺少key3。
    • A将key1: value1发送给B,B将key3: value3发送给A。
    • 最终,A和B都拥有{key1: value1, key2: value2, key3: value3}。
  1. Rumor Mongering (谣言传播) 🗣️
  • 原理:
    • 一个节点(比如A)随机选择其他节点(比如B),将消息(谣言)发送给B。 📢
    • B收到消息后,如果之前没有收到过,就将消息标记为已收到,并继续随机选择其他节点传播。 ➡️
    • 如果B已经收到过该消息,就停止传播,但会以一定的概率(称为“传播概率”)继续传播。 🤔
    • 当消息传播的次数达到一定阈值(称为“停止阈值”)时,节点就会停止传播该消息。 🛑
  • 流程:
    1. 节点A产生一个新消息。
    2. A随机选择节点B,将消息发送给B。
    3. B收到消息后,检查是否已经收到过该消息:
      • 如果未收到过,则将消息标记为已收到,并随机选择其他节点继续传播。
      • 如果已收到过,则以一定的概率继续传播,否则停止传播。
    4. 重复步骤2和3,直到消息传播的次数达到停止阈值。
  • 特点:
    • 传播速度快: 消息可以迅速传播到整个网络。 ⚡
    • 可能存在消息丢失: 由于节点可能停止传播消息,因此不能保证所有节点都能收到消息。 ⚠️
    • 资源消耗较低: 每个节点只需要传播有限次数的消息。 💰
    • 需要设置合适的传播概率和停止阈值: 这两个参数会影响消息传播的速度和可靠性。 ⚙️
  • 适用场景:
    • 对实时性要求高,允许一定概率的消息丢失的场景。
    • 例如,故障检测、路由信息传播。
  • 举例:
    • 假设节点A产生一个新消息“明天放假!🎉”。
    • A随机选择节点B,将消息发送给B。
    • B收到消息后,如果之前没有收到过,就将消息标记为已收到,并随机选择节点C继续传播。
    • C收到消息后,如果已经收到过,就以一定的概率(比如50%)继续传播,否则停止传播。
    • 当消息传播的次数达到停止阈值(比如10次)时,节点就会停止传播该消息。
  1. Aggregation (聚合) ➕
  • 原理:
    • 节点在传播消息的同时,对消息进行聚合处理,例如求和、平均值等。 📊
    • 每个节点将自己的数据与收到的数据进行聚合,然后继续传播。 ➡️
    • 最终,所有节点都会收到聚合后的数据。 ✅
  • 流程:
    1. 每个节点都有自己的数据。
    2. 节点A随机选择节点B,将自己的数据发送给B。
    3. B收到A的数据后,将自己的数据与A的数据进行聚合(例如,求和),然后随机选择其他节点继续传播。
    4. 重复步骤2和3,直到所有节点都收到了聚合后的数据。
  • 特点:
    • 减少消息传播的数据量: 通过聚合,可以减少消息传播的数据量,提高效率。 📉
    • 适用于数据统计分析: 可以方便地进行数据统计分析。 📈
    • 需要选择合适的聚合函数: 聚合函数的选择会影响最终结果的准确性。 🧮
  • 适用场景:
    • 需要对数据进行统计分析的场景。
    • 例如,计算集群的平均负载、总请求数等。
  • 举例:
    • 假设有三个节点A、B、C,分别有数据1、2、3。
    • A将自己的数据1发送给B。
    • B收到A的数据后,将自己的数据2与A的数据1进行求和,得到3,然后将3发送给C。
    • C收到B的数据后,将自己的数据3与B的数据3进行求和,得到6。
    • 最终,所有节点都收到了聚合后的数据6。
  1. Push-Pull 🤝
  • 原理:
    • 结合了Push和Pull两种方式。 ➡️⬅️
    • 节点既可以主动推送消息给其他节点(Push),也可以从其他节点拉取消息(Pull)。 📤📥
    • Push方式用于快速传播新消息,Pull方式用于修复消息丢失。 🚑
  • 流程:
    1. 节点A产生一个新消息。
    2. A随机选择节点B,将消息推送给B(Push)。
    3. B收到消息后,检查是否已经收到过该消息:
      • 如果未收到过,则将消息标记为已收到。
      • 如果已收到过,则忽略该消息。
    4. 节点定期从其他节点拉取消息(Pull),以修复消息丢失。
  • 特点:
    • 提高了消息传播的效率和可靠性: Push方式可以快速传播新消息,Pull方式可以修复消息丢失。 🚀✅
    • 需要设置合适的Push和Pull频率: 这两个参数会影响消息传播的速度和可靠性。 ⚙️
  • 适用场景:
    • 适用于各种场景,是比较常用的Gossip协议变种。
    • 例如,成员管理、数据同步。
  • 举例:
    • 假设节点A产生一个新消息“节点C加入集群!🎉”。
    • A随机选择节点B,将消息推送给B(Push)。
    • B收到消息后,如果之前没有收到过,则将消息标记为已收到。
    • 每个节点定期从其他节点拉取消息(Pull),以确保自己拥有最新的集群成员信息。

四、 Gossip协议的优缺点

优点:👍

  1. 去中心化: 没有中心节点,避免了单点故障,提高了系统的可用性。 🛡️
  2. 容错性强: 即使部分节点失效,消息仍然可以通过其他节点传播。 💪
  3. 可扩展性好: 可以很容易地添加新的节点,而不会影响整个系统的性能。 ➕
  4. 最终一致性: 最终所有节点都会收到消息,保证数据的一致性。 ✅
  5. 简单易实现: 协议本身比较简单,容易实现和部署。 👨‍💻

缺点:

  1. 最终一致性: 不能保证实时一致性,存在一定的延迟。 ⏳
  2. 消息冗余: 消息可能会被重复传播,浪费网络带宽。 ♻️
  3. 收敛速度: 消息传播的速度可能较慢,取决于节点的数量和网络拓扑。 🐌
  4. 安全性: 容易受到恶意节点的攻击,例如传播虚假消息。 😈

五、 总结:

Gossip协议是一种非常强大的分布式通信协议,适用于构建大规模、去中心化、容错性强的系统。 虽然存在一些缺点,但可以通过一些优化手段来改善,例如:

  • 控制消息传播的范围: 限制每个节点传播消息的次数。 🎯
  • 使用加密技术: 防止恶意节点传播虚假消息。 🔒
  • 优化网络拓扑: 选择合适的节点进行通信,提高消息传播的速度。 🗺️

希望这篇文章能够帮助你理解Gossip协议! 记住,Gossip协议就像流言蜚语一样,通过节点之间的随机通信,最终将信息传播到整个网络。 🌐 祝你学习愉快! 😊

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

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

相关文章

【C++初阶】----模板初阶

1.泛型函数 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。 2.函数模板 2.1函数模板的概念 函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型…

git-- github的使用--账户和本地连接

以下指令在git 执行bash 流程:先看有没有密钥; 没有的话,在电脑生成密钥对,公钥复制到github; 要想使用https,配置令牌,注意令牌有期限问题,连接不了有可能是期限问题 一个电脑对…

OTN(Optical Transport Network)详解

OTN(光传送网)是一种基于**波分复用(WDM)**的大容量光传输技术,结合了SDH的运维管理优势和WDM的高带宽特性,广泛应用于骨干网、城域核心层及数据中心互联(DCI)。 1. OTN 的基本概念 …

Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比

以下是 Python 中列表(List)、元组(Tuple)、集合(Set)和字典(Dict)四大数据结构的完整对比分析,结合了核心特性、操作方式和应用场景的深度总结: 一、核心特性…

Angular由一个bug说起之十五:自定义基于Overlay的Tooltip

背景 工具提示(tooltip)是一个常见的 UI 组件,用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本,所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…

软件工程面试题(十五)

1、servlet 创建过程以及ruquest,response,session的生命周期? Servlet的创建过程: 第一步 public class AAA extends HttpServlet{ 实现对应的doxxx方法 } 第二步: 在web.xml中配置 <servlet> <servlet-name></servlet-name> <servlet-c…

搭建QNX Software Center的Docker环境

背景 本人使用 Ubuntu Server 22.04 服务器&#xff0c;所以没有图形界面&#xff0c;而 QNX Software Center 需要图形界面。为了保证服务器环境的整理&#xff0c;计划使用Docker部署QNX Software Center 一瓶安装图形界面。本方既是实现方案的记录。 资源 Dockerfile&…

C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿、推荐…

粘包问题解决方案

粘包问题详解&#xff1a;TCP协议中的常见问题及Go语言解决方案 一、什么是粘包问题&#xff1f; 粘包问题是指在TCP通信中&#xff0c;发送方发送的多个独立消息在接收方被合并成一个消息接收的现象。换句话说&#xff0c;发送方发送的多条消息在接收方被“粘”在一起&#…

vue:突然发现onok无法使用

const that this;this.$confirm({title: "修改商品提示",content: "如果当前商品存在于商品活动库&#xff0c;则在商品活动库的状态会下架",onOk: function () {that.submitForm();}}); 突然发现 this.$confirm无法进入onok 最终发现是主题冲突&#x…

redis hashtable 的sizemask理解

在 Redis 的哈希表实现中&#xff0c;index hash & dict->ht[0].sizemask 是计算键值对应存储位置的核心操作。这个操作看起来简单&#xff0c;但背后涉及哈希表的内存布局和性能优化策略。我们通过以下步骤逐步解析其原理&#xff1a; 一、哈希表的设计目标 快速定位…

Ruby 命令行选项

Ruby 命令行选项 概述 Ruby 是一种广泛使用的编程语言,它拥有强大的命令行工具,可以帮助开发者进行各种任务。了解 Ruby 的命令行选项对于提高开发效率至关重要。本文将详细介绍 Ruby 的常用命令行选项,帮助开发者更好地利用 Ruby 的命令行功能。 Ruby 命令行选项概述 R…

【STM32】WDG看门狗(学习笔记)

学习来源----->江协科技STM32 WDG简介 WDG&#xff08;Watchdog&#xff09;看门狗看门狗可以监控程序的运行状态&#xff0c;当程序因为设计漏洞、硬件故障、电磁干扰等原因&#xff0c;出现卡死或跑飞现象时&#xff0c;看门狗能及时复位程序&#xff0c;避免程序陷入长…

Java 数据库连接池

HikariCP 老外开源的。 Spring Boot 2 之后默认选择的连接池。 号称性能最快的数据库连接池。 为什么性能好呢&#xff1f; ● 字节码级别的优化-尽量的利用 JIT 的内联手段 ● 字节码级别的优化-利用更容易被 JVM 优化的指令 ● 代码级别的优化-利用改造后的 FastList 代替…

Spring Boot中@Valid 与 @Validated 注解的详解

Spring Boot中Valid 与 Validated 注解的详解 引言Valid注解功能介绍使用场景代码样例 Validated注解功能介绍使用场景代码样例 Valid与Validated的区别结论 引言 在Spring Boot应用中&#xff0c;参数校验是确保数据完整性和一致性的重要手段。Valid和Validated注解是Spring …

C++搜索

功能扩展说明&#xff1a; 图类封装&#xff1a;将图数据结构封装为类&#xff0c;提高代码复用性 最短路径查找&#xff1a;基于BFS实现未加权图的最短路径查找 路径重构&#xff1a;通过parent数组回溯构建完整路径 异常处理&#xff1a;当路径不存在时返回空向量 复杂度分析…

2023第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组(真题题解)(C++/Java题解)

本来想刷省赛题呢&#xff0c;结果一不小心刷成国赛了 真是个小迷糊〒▽〒 但&#xff0c;又如何( •̀ ω •́ )✧ 记录刷题的过程、感悟、题解。 希望能帮到&#xff0c;那些与我一同前行的&#xff0c;来自远方的朋友&#x1f609; 大纲&#xff1a; 一、子2023-&#xff…

CSS学习笔记6——网页布局

目录 一、元素的浮动属性、清除浮动 清除浮动的其他方法 1、使用空标签清除浮动影响 2、使用overflow属性清除浮动 3、使用伪元素清除浮动影响 原理 overflow属性 二、元素的定位 1、相对定位 2、绝对定位 ​编辑 3、固定定位 z-index层叠等级属性 一、元素的浮动…

sqlalchemy:将mysql切换到OpenGauss

说明 之前python的项目使用的mysql&#xff0c;近期要切换到国产数据库OpenGauss。 之前的方案是fastapisqlalchemy&#xff0c;测试下来发现不用改代码&#xff0c;只要改下配置即可。 切换方案 安装openGauss-connector-python-psycopg2 其代码工程在&#xff1a;https:…

uniapp 获取dom信息(封装获取元素信息工具函数)

在uniapp开发中&#xff0c;需要获取到dom的信息&#xff0c;需要用到uniapp的指定方式 uni.createSelectorQuery()&#xff0c;但是每次需要用到的时候都需要很长一段的繁琐代码&#xff0c;本篇文章将呈现获取dom信息方法封装&#xff0c;话不多说&#xff0c;上菜&#xff1…