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

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

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

通信的角色

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

  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)

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

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

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

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

相关文章

鸿蒙开发中的坑(持续更新……)

最近在使用鸿蒙开发时&#xff0c;碰到了一些坑&#xff0c;特做记录&#xff0c;如&#xff1a;鸿蒙的preview不能预览&#xff0c;轮播图组件Swiper使用时的问题&#xff0c;console.log() 打印的内容 一、鸿蒙的preview不能预览 首先&#xff0c;只有 ets文件才能预览。 其…

SICP : The Elements of Programming

好的计算机编程语言应具备的三个特性 基础单元表达式&#xff0c;计算机编程语言最最最基础单元&#xff0c;理应具备的表达式组合的能力&#xff0c;能够通过基础单元表达式组合成更复杂的元素抽象的能力&#xff0c;能通过复杂的元素抽象成更高层的单元 基础单元表达式 加 …

外卖系统开发:构建高效、安全的外卖平台

在当今数字化时代&#xff0c;外卖系统成为了餐饮行业不可或缺的一部分。本文将介绍如何使用一些主流的技术和代码片段来开发一个简单而功能强大的外卖系统。 1. 技术选择 在开始外卖系统的开发之前&#xff0c;首先需要选择合适的技术栈。以下是一个常见的技术栈&#xff1…

树莓派Pi4B简介

树莓派是什么&#xff1f;Raspberry Pi(中文名为“树莓派”,简写为RPi&#xff0c;或者RasPi/RPi)是为学生计算机编程教育而设计&#xff0c;只有信用卡大小的卡片式电脑&#xff0c;其系统基于Linux。 树莓派4B与树莓派3B/3B参数对比&#xff1a; 具体的实物图如下&#xff1a…

MyBatis——MyBatis的缓存

MyBatis的缓存 创建工程&#xff1a; 1缓存介绍 为什么使用缓存&#xff1f; 首次访问时&#xff0c;查询数据库&#xff0c;并将数据存储到内存中&#xff1b;再次访问时直接访问缓存&#xff0c;减少IO、硬盘读写次数、提高效率 Mybatis中的一级缓存和二级缓存&#xff1f;…

二维码智慧门牌管理系统:提升社区管理智能化水平

文章目录 前言一、全方位信息录入与查询二、公安权限账户访问的公安大数据后台三、社区工作人员申请权限安装录入软件四、业主通过移动终端扫描标准地址二维码门牌自主申报录入五、系统的价值 前言 在数字化时代&#xff0c;社区管理面临着更新流动人口信息、准确录入六实相关…

jenkins Job华为云EIP变更带宽

引言: 在数字化时代&#xff0c;云服务资源的弹性管理是企业降低运营成本、提高效率的关键手段。通过弹性公网IP&#xff08;EIP&#xff09;服务&#xff0c;企业可以实现按需计费&#xff0c;优化网络支出。然而&#xff0c;根据业务流量的不同阶段调整计费模式&#xff0c;…

ARM串口通信编程实验

完成&#xff1a;从终端输入选项&#xff0c;完成点灯关灯&#xff0c;打开风扇关闭风扇等操作 #include "gpio.h" int main() {char a;//char buf[128];uart4_config();gpio_config();while(1){//接收一个字符数据a getchar();//发送接收的字符putchar(a);switch(…

网络安全保障领域

计算机与信息系统安全---最主要领域 云计算安全 IaaS、PasS、SaaS(裸机&#xff0c;装好软件的电脑&#xff0c;装好应用的电脑) 存在风险&#xff1a;开源工具、优先访问权、管理权限、数据处、数据隔离、数据恢复、调查支持、长期发展风险 云计算安全关键技术&#xff1a;可信…

华清远见嵌入式学习——ARM——作业3

作业要求&#xff1a; 代码效果图&#xff1a; 代码&#xff1a; led.h #ifndef __LED_H__ #define __LED_H__#define RCC_GPIO (*(unsigned int *)0x50000a28) #define GPIOE_MODER (*(unsigned int *)0x50006000) #define GPIOF_MODER (*(unsigned int *)0x50007000) #defi…

音视频技术开发周刊 | 325

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 AI读心术震撼登顶会&#xff01;模型翻译脑电波&#xff0c;人类思想被投屏&#xff5c;NeurIPS 2023 在最近举办的NeurIPS大会上&#xff0c;研究人员展示了当代AI更震撼…

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势 本章节主要参考书籍《Xilinx Zynq-7000 嵌入式系统设计与实现 基于ARM Cortex-A9双核处理器和Vivado的设计方法 (何宾&#xff0c;张艳辉编著&#xff09;》 本章节主要讲述FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势&#xff0c;学习笔…

Rancher小白学习之路

官网&#xff1a;http://docs.rancher.cn/docs/rancher1/rancher-service/load-balancer/_indexhttp://docs.rancher.cn/docs/rancher1/rancher-service/load-balancer/_indexRancher2.5集群搭建&K3S生产环境搭建手册 - 知乎 【rancher教程】十年运维大佬两小时带你搞定ran…

关于MybatisPlus自动转化驼峰命名规则配置mapUnderscoreToCamelCase的个人测试和总结

关于MybatisPlus自动转化驼峰命名规则配置mapUnderscoreToCamelCase的个人测试和总结 测试一&#xff1a;没有添加 自动转化的配置&#xff0c;且domain中的属性名称和数据库的字段名称一致测试二&#xff1a;没有添加自动转化配置i&#xff0c;domain属性名userPassword和数据…

【csapp】cachelab

文章目录 Part APart B32 * 3264 * 6461 * 67 实验全程参考大佬的博客CS:APP3e 深入理解计算机系统_3e CacheLab实验 &#xff0c;感觉大佬在矩阵转置那块介绍的还是有些简略&#xff0c;我自己又做了点动图加以补充理解。膜拜大佬&#xff01; Part A 先解决解析命令行参数的…

年龄相关的微环境变化突显了PDGF-C在ER+乳腺癌转移复发中的作用

今天给同学们分享一篇实验文章“Age-associated microenvironmental changes highlight the role of PDGF-C in ER breast cancer metastatic relapse”&#xff0c;这篇文章发表在Nat Cancer期刊上&#xff0c;影响因子为22.7。 结果解读&#xff1a; ER乳腺癌转移复发的同种…

LH7904D 太阳能警示灯 0.4W×2

应用范围: 可安装在电线杆&#xff0c;路灯&#xff0c;围挡&#xff0c;交 通护栏及各种杆式固体等场所起警示作用。 产品特点&#xff1a; 采用进口PS材质; 光控无开关&#xff0c;白天不闪&#xff0c;昏暗环境自动闪烁&#xff0c;无需手动操作&#xff0c;省时省事; …

cfa一级考生复习经验分享系列(十)

我的背景&#xff1a;我是在职备考CFA的&#xff0c;工作也是跟金融不相关的&#xff0c;工作日基本只有晚上能看最多2-3小时&#xff0c;主要靠周末大块时间复习。由于平时工作忙碌直到9月中才开始看各种资料。但是可能我复习策略比较有效率&#xff0c;所以最后4次官方mock平…

彻底搞懂MySQL的执行计划

欢迎关注微信公众号&#xff1a;互联网全栈架构 MySQL执行计划&#xff08;EXPLAIN&#xff09;可以提供SQL运行的一些信息&#xff0c;相当于模拟SQL的执行&#xff0c;从而让我们可以对SQL语句做更深入的分析和了解。在实际开发过程中&#xff0c;我们经常会使用执行计划来分…

编写fastapi接口服务

FastAPI是一个基于 Python 的后端框架&#xff0c;该框架鼓励使用 Pydantic 和 OpenAPI (以前称为 Swagger) 进行文档编制&#xff0c;使用 Docker 进行快速开发和部署以及基于 Starlette 框架进行的简单测试。 step1&#xff1a;安装必要库 pip install fastapi uvicorn st…