分布式系统架构设计之分布式通信机制

news2025/2/7 20:09:17

二、分布式通信机制:保障系统正常运行基石

在分布式系统中,各个组件之间的通信是保障系统正常运行的基石,直接影响到系统的性能、可扩展性以及整体的可维护性。接下来我们就一起看看通信在分布式系统中的重要性,以及一些常用的技术实现方案。

通信的角色

在分布式系统中,通信扮演着连接各个节点的纽带,保障节点之间能够有效传递信息,关键角色主要包括:

  1. 节点之间的通信:分布式系统的核心在于多个节点之间的协同工作,节点通信是实现这一目标的基础
  2. 跨网络的通信:分布式系统通常部署在不同地理位置的服务器上,因此跨网络通信需要关注效率和安全性
  3. 异步通信:通过异步通信,系统能够更好地处理大量请求,提高整体性能和响应速度

通信的重要性

  1. 节点协同:分布式系统的核心在于多个节点之间的协同工作,而节点之间的协同离不开高效的通信机制
  2. 系统整合:一个分布式系统通常由多个独立的服务组成,它们需要相互通信以完成整体业务流程
  3. 性能优化:良好的通信机制可以优化系统性能,提高各节点之间的信息传递效率

常用通信实现技术方案

为了实现高效的通信,不同的技术和协议被开发出来以满足各种场景和需求。以下关于分布式系统中通信的一些技术实现、优缺点以及常用的技术框架或组件进行一个总结介绍:

同步通信场景

同步通信是一种阻塞式通信方式,发送方在等待接收方的确认之前不会进行其他操作,这种方式确保了数据的可靠性。

优点
  • 数据完整性:每个消息都会得到确认
  • 简单易用:编程模型相对简单
缺点
  • 性能:由于需要等待确认,可能影响系统的整体性能
  • 延迟:如果网络延迟较高,可能会导致请求响应时间增加
常用技术框架/组件

RPC(Remote Procedure Call) 框架,现今 RPC 框架可谓是百花齐放,比如 gRPC、Dubbo、Thrift 等,后面我有一个专门讲 RPC 的主题,可以期待一下。

异步通信场景

异步通信是非阻塞式的,发送方在发送消息后不需要等待接收方的确认就可以继续执行其他操作,这种模式通常使用消息队列来传递消息。

优点
  • 高性能:允许你系统在不等待回应的情况下处理更多任务
  • 解耦:发送者和接收者之间解耦,提高了系统的灵活性和可扩展性
缺点
  • 复杂性:相比同步通信,异步通信的编程模型更复杂
  • 可靠性:如果不采取额外措施,可能会丢失数据
常用技术框架/组件

消息队列,如 Apache Kafka、RabbitMQ、RocketMQ 等,后面我也有一个专门讲消息队列的主题,继续期待。

单播通信场景

单播通信是点对点的通信方式,一个节点向另一个特定的节点发送消息。

优点
  • 易于理解和实现
  • 资源利用效率高,因为只有一条路径进行传输
缺点
  • 如果目标节点不可达,可能导致消息丢失

广播通信场景

广播通信是一种一对多的通信方式,一个节点向所有其他节点发送相同的消息。

优点
  • 在需要通知多个节点时非常有用
缺点
  • 网络带宽消耗大,特别是当网络中有大量节点时

组播通信场景

组播通信介于单播和广播之间,一个节点向一组特定的节点发送消息。

优点
  • 与广播相比,减少了不必要的资源消耗
  • 适用于需要同时通知多个节点但不是全部节点的情况
缺点
  • 实现起来较为复杂,需要网络支持组播功能
常用技术框架/组件

组播库,如 Java 的 MulticastSocket 类。

流通信场景

流通信是一种持续的数据交换方式,适合传输大量数据或实时媒体内容。

优点
  • 支持大数据量传输
  • 实时性强,适合音视频等流媒体应用
缺点
  • 对网络稳定性要求较高
常用技术框架/组件

RTMP(Real-Time Messaging Protocol)、WebRTC(Web Real-Time Communication)等流媒体传输协议

通过选择适用于具体场景的通信技术,可以有效提高分布式系统的整体性能和可维护性。在实际应用中,通过需要根据系统的需求、架构的特点以及团队技术栈的熟悉程序来综合考虑选择最合适的通信方式。

问题解答

为什么单播通信场景和广播通信场景没有常用的技术框架/组件?

对于单播通信场景和广播通信场景,尽管是网络通信的基本场景,但是在分布式系统中,通常不会直接使用特定的框架/组件来实现这些通信场景,而是通过更高级别的抽象来完成,比如编程语言提供的网络库、操作系统提供的套接字 API、其他中间件等。

在使用 TCP/IP 协议时,无论是单播还是广播通信,都是通过 Socket API 来实现,可以配置目的 IP 地址和端口号来决定是发送到单个目标还是广播到所有接受者。

在有些情况下,一些中间件或技术可能会提供对单播和广播的支持,但他们通常不是专门为了实现这两种通信模式而设计的,比如一些网络库,像BSD Sockets(C/C++)、Java 的 java.net.Socket 类、Python 的 socket 模块等。

从上面介绍的通信场景中为什么没有 WebSocket 呢?

WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许客户端和服务器之间建立持久性的连接,以便进行双向通信。WebSocket 协议通过一个握手过程开始,在这个过程中,客户端和服务器交换 HTTP 请求和响应来升级连接到 WebSocket。

从通信模式的角度看,WebSocket 可以被视为一种异步、双向的消息传递机制。然而,由于它是基于单一的长连接,它既不是传统的单播也不是广播,而是提供了一种更高级别的抽象,使得开发人员可以方便地实现各种通信模式。

通过使用 WebSocket,你可以很容易地实现:

  • 单播通信:向特定的目标节点发送消息
  • 广播通信:将消息发送给所有连接到同一 WebSocket 服务器的客户端
  • 组播通信:通过在服务器端进行逻辑处理,实现类似于组播的功能,如向一组具有特定属性或订阅了特定主题的客户端发送消息

因此,WebSocket 不属于上述的任何一种方式,而是一种能够支持多种通信模式的技术。

WebSocket 适用与实时性要求高、频繁通信的场景,比如在线聊天、实时监控等,不过相对于 HTTP,它引入了更多的开销,适用场景相对有限。

从上面介绍的通信场景中为什么没有 HTTP/RESTful 呢?

HTTP/RESTful 不完全属于上述的任何一种通信模式。它是一种应用层协议,通常用于在分布式系统中实现客户端与服务器之间的交互。而上面提到的单播、广播和组播是网络层或传输层的概念,它们描述的是数据在网络中的传输方式。

HTTP/RESTful 更多地关注于如何设计和使用 HTTP 协议来实现资源导向的架构风格(即 REST,Representational State Transfer)。RESTful API 是基于 HTTP 协议,通过使用不同的 HTTP 方法(如 GET、POST、PUT、DELETE 等)来操作资源,从而提供了一种标准的方式来访问和修改远程服务的状态。

从某种程度上讲,HTTP/RESTful 可以视为一种异步通信方式,因为客户端发送请求后不需要等待服务器响应就可以继续执行其他任务。然而,这并不意味着 HTTP/RESTful 就等同于异步通信。实际上,根据具体的应用场景和编程模型,HTTP/RESTful 也可以被用来实现同步通信。

总之,HTTP/RESTful 是一种用于构建分布式系统中客户端-服务器通信的技术,它可以支持多种通信模式,包括但不限于异步通信。

补充知识点:同步、异步、阻塞和非阻塞

在实际编程中,同步、异步、阻塞和非阻塞这是四个非常关键的概念,涉及到程序执行的并发性和数据一致性。专门补充介绍以下相关的概念和要求。

同步(Synchronous)

通常是指在执行一个操作时,调用者需要等待该操作完成才能继续执行后续的代码。例如,在Java中,当你调用一个方法并期望立即得到结果时,这就是同步行为。同步确保了操作的顺序性,并且可以避免竞态条件。

public int sum(int a, int b) {
    return a + b;
}

int result = sum(10, 20);
异步(Asynchronous)

意味着调用者不需要等待操作完成就可以继续执行其他任务。在异步编程中,当一个操作开始时,控制权立刻返回给调用者,而实际的操作会在后台线程中进行。异步操作完成后,通常会通过回调函数或 Future 对象通知调用者。

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(() -> {
    Thre`ad.sleep(1000);
    return 42;
});

// 异步操作开始后,可以做其他事情
System.out.println("Doing other things...");

// 当需要结果时,可以检查是否已经完成
Integer result = future.get(); // 如果尚未完成,这将阻塞直到结果可用
阻塞(Blocking)

是指在执行某个操作时,线程会被挂起,直到满足特定条件或操作完成为止。在Java中,许多I/O操作(如文件读写、网络通信等)默认是阻塞的,这意味着如果资源未准备好,调用线程将会被挂起,直到资源就绪。

InputStream is = new FileInputStream("file.txt");
byte[] buffer = new byte[1024];
int bytesRead = is.read(buffer); // 这个调用可能会阻塞,直到从文件中读取到数据
非阻塞(Non-Blocking)

指在执行操作时,即使资源尚未准备就绪,也不会导致线程被挂起。相反,非阻塞操作会立即返回一个状态,告诉调用者当前资源的状态(如“已就绪”、“正在进行”或“错误”)。非阻塞操作通常结合轮询或事件通知机制来实现。

在Java NIO(非阻塞I/O)中,提供了非阻塞的I/O通道,可以通过轮询的方式来检查数据是否可用。

Selector selector = Selector.open();
SocketChannel channel = SocketChannel.open(new InetSocketAddress("localhost", 8080));
channel.configureBlocking(false);

channel.register(selector, SelectionKey.OP_READ);

while (true) {
    if (selector.select() > 0) { // 这是非阻塞调用,如果没有可读的数据,将立即返回
        Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
        while (keys.hasNext()) {
            SelectionKey key = keys.next();
            if (key.isReadable()) {
                ByteBuffer buffer = ByteBuffer.allocate(1024);
                int bytesRead = ((SocketChannel) key.channel()).read(buffer);
                // 处理读取到的数据...
            }
            keys.remove();
        }
    }
}

同步和异步关注的是调用者与被调用者之间的协作模式,阻塞和非阻塞关注的是线程在执行过程中是否会被暂停。两者之间是可以相互组合,以实现不同的并发编程模式,常见组合说明如下:

同步阻塞(Synchronous Blocking)

这是最常见的编程模型,调用者需要等待操作完成,并且在等待期间线程会被阻塞。

同步非阻塞(Synchronous Non-Blocking)

在这种情况下,调用者仍然需要等待操作完成,但不会阻塞线程。通常通过轮询或事件通知机制来检测操作是否完成。

异步阻塞(Asynchronous Blocking)

这种组合比较少见,因为异步操作的目的通常是避免阻塞。然而,在某些特定场景下,如等待异步操作的结果时,可能会发生阻塞。

异步非阻塞(Asynchronous Non-Blocking)

这是现代高并发系统中最常用的编程模型。调用者不需要等待操作完成,并且在等待期间不会阻塞线程。

理解这些概念及其组合可以帮助你更好地设计并发和分布式系统的代码。在实际应用中,根据性能、资源利用率和响应时间等需求,选择合适的编程模型至关重要。

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

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

相关文章

java八股 redis

Redis篇-01-redis开篇_哔哩哔哩_bilibili 1.缓存穿透 2.缓存击穿 逻辑过期里的互斥锁是为了保证只有一个线程去缓存重建 3.缓存雪崩 4.双写一致性 4.1要求一致性&#xff08;延迟双删/互斥锁&#xff09; 延迟双删无法保证强一致性 那么前两步删缓和更新数据库哪个先呢&#xf…

kubernetes(k8s) Yaml 文件详解

YAML格式&#xff1a;用于配置和管理&#xff0c;YAML是一种简洁的非标记性语言&#xff0c;内容格式人性化&#xff0c;较易读。 1、查看API 资源版本标签 kubectl api-versions 2、编写资源配置清单 kubectl create -f nginx-test.yaml --validatefalse 2.3 查看创建的po…

【Python可视化系列】一文教会你绘制美观的热力图(理论+源码)

一、问题 前文相关回顾&#xff1a; 【Python可视化系列】一文彻底教会你绘制美观的折线图&#xff08;理论源码&#xff09; 【Python可视化系列】一文教会你绘制美观的柱状图&#xff08;理论源码&#xff09; 【Python可视化系列】一文教会你绘制美观的直方图&#xff08;理…

docker部署kafka zookeeper模式集群

单机模式链接&#xff1a;https://blog.csdn.net/wsdhla/article/details/133032238 kraft集群模式链接&#xff1a;部署Kafka_kafka 部署-CSDN博客 zookeeper选举机制举例&#xff1a; 目前有5台服务器&#xff0c;每台服务器均没有数据&#xff0c;它们的编号分别是1,2,3,4,5…

鸿蒙开发(二)- 鸿蒙DevEco开发环境搭建

上篇说到&#xff0c;鸿蒙开发目前势头旺盛&#xff0c;头部大厂正在如火如荼地进行着&#xff0c;华为也对外宣称已经跟多个厂商达成合作。目前看来&#xff0c;对于前端或客户端开发人员来说&#xff0c;掌握下鸿蒙开发还是有些必要性的。如果你之前是从事Android开发的&…

【计算机网络】—— 奈氏准则和香农定理

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 失真 - 信号的变化 ​编辑影像失真的因素&#xff1a; ​编辑信道带宽&#xff1a; 码间串扰…

通过 Bytebase API 做数据库 Schema 变更

Bytebase 是一款数据库 DevOps 和 CI/CD 工具&#xff0c;适用于开发人员、DBA 和平台工程团队。 它提供了一个直观的图形用户界面来管理数据库 Schema 变更。另一方面&#xff0c;一些团队可能希望将 Bytebase 集成到现有的内部 DevOps 研发平台中。这需要调用 Bytebase API。…

内存管理--bss data txt数据段与stm32的ZI-data RW-data RO-data Code数据段的关系

目录 前沿 1 数据在内存中的位置 1.1 堆栈在内存中的位置 1.2 全局变量和局部变量在内存中的位置 1.2.1 全局变量在内存中的位置 1.2.2 局部变量在内存中的位置 1.3 static变量在内存中的位置 1.4 malloc赋值的变量存放在内存中的位置 1.5 代码在内存中的位置 2 ZI-d…

udp广播的例子

以下是一个使用C语言描述广播发送和接收的简单示例&#xff1a; 发送端&#xff08;广播发送&#xff09;&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <netinet/in.h> #inclu…

如何使用Docker将.Net6项目部署到Linux服务器(二)

目录 二 安装Redis 2.1 基本安装 2.1.1 下载Redis 2.1.2 解压并安装Redis 2.1.3 编译Redis 2.1.3 配置config文件 2.1.4 配置redis服务 2.1.5 关闭redis服务 2.2 Docker安装 2.2.1 拉取镜像 2.2.2 查看镜像 2.2.2 创建挂载目录 2.2.3 创建配置文件 2.2.4 创建容器…

几种串口扩展电路

一、IIC串口扩展电路 LCT200 是一款可以通过 I2C 接口通讯&#xff0c;拓展 2 路独立串口的通讯芯片&#xff0c;同时也支持通过 2 路串口读写 I2C 接口的数据。LCT200 的封装为 TSSOP-20。 主要功能&#xff1a;⚫ 通过对 I2C 接口读写实现拓展 2 路独立串口功能 ⚫ 通过读写…

Linux学习教程(第十八章 SELinux管理)

第十八章 SELinux管理 root 用户实在是一个超人&#xff0c;它在 Linux 系统当中就是无所不能的&#xff0c;而且读、写和执行权限对 root 用户完全没有作用。root 用户的存在极大地方便了 Linux 的管理&#xff0c;但是也造成了一定的安全隐患。 大家想象一下&#xff0c;如果…

LabVIEW与PID在温度测控系统中的应用

LabVIEW与PID在温度测控系统中的应用 本案例介绍LabVIEW在温度控制系统中的应用&#xff0c;特别是结合PID算法。项目使用abVIEW作为主要开发工具&#xff0c;配合NI PCI-7831R数据采集和控制设备&#xff0c;实现了高效的温度调节。 系统的核心在于LabVIEW的FPGA模块&#x…

编译opencv和opencv_contrib

1 下载源码 下载opencv源码https://github.com/opencv/opencv 下载opencv源码https://github.com/opencv/opencv_contrib 2 开始编译 构建需要下载ffmpeg的包&#xff0c;cmake构建时会自动下载&#xff0c;但是比较满&#xff0c;这里可以从下面链接直接下载 https://downloa…

怎么判断台灯是否护眼?分享适合考研使用的护眼台灯

虽然台灯是家家户户都会有的一盏照明设备&#xff0c;但是很多人并不是了解自家台灯是好是坏&#xff0c;能不能护眼等等。其实台灯是非常有讲究的&#xff0c;如果长期使用一些不合格、劣质的台灯&#xff0c;会让我们在不知不觉中造成视力损伤&#xff0c;从而导致近视。 也…

中后缀表达式

一、利用后缀表达式进行计算 1&#xff09;解题思路 如果当前字符串是操作数&#xff0c;就将该操作数入栈&#xff1b;如果当前字符串是操作符&#xff0c;就取栈顶的两个操作数进行运算&#xff08;注意&#xff1a;第一个出栈的数为计算时的右操作数&#xff1b;第二个出栈…

【深度学习-目标检测】03 - Faster R-CNN 论文学习与总结

论文地址&#xff1a;Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks 论文学习 1. 摘要与引言 研究背景与挑战&#xff1a;当前最先进的目标检测网络依赖于 区域提议&#xff08;Region Proposals&#xff09;来假设目标的位置&#xff0c…

计算机服务器中了halo勒索病毒如何解密,halo勒索病毒解密数据恢复

计算机技术的不断发展&#xff0c;为企业的生产运营提供了极大便利&#xff0c;但也为网络安全埋下隐患&#xff0c;网络上的勒索病毒种类也在不断增加&#xff0c;给企业的数据安全带来了严重威胁。近日&#xff0c;云天数据恢复中心接到许多企业的求助&#xff0c;企业的计算…

HarmonyOS应用程序包-(上)

应用程序包-(上) 1.应用程序包概述 用户应用程序泛指运行在设备的操作系统之上&#xff0c;为用户提供特定服务的程序&#xff0c;简称“应用”。一个应用所对应的软件包文件&#xff0c;称为“应用程序包”。 HarmonyOS提供了应用程序包开发、安装、查询、更新、卸载的管理…

【Spring实战】06 ApplicationRunner

文章目录 1. 简介2. 使用1&#xff09;单个 ApplicationRunner2&#xff09;获取命令行参数3&#xff09;多个 ApplicationRunner 3. 优点4. 缺点总结 ApplicationRunner 是 Spring Boot 提供的一个接口&#xff0c;与 CommandLineRunner 类似&#xff0c;用于在 Spring Boot 应…