分布式系统概念和设计-分布式对象和远程调用
分布式系统概念和设计
分布式对象和远程调用
能够接收远程方法调用的对象称为远程对象,远程对象实现一个远程接口。
调用者和被调用对象分别存在不同的失败可能性,RMI和本地调用有不同的语义。
-
中间件
在进程和消息传递等基本构造模块之上提供编程模型的软件为中间件。中间层使用基于进程通信消息的协议提供更高级的抽象,如远程调用和事件。重要作用是提供位置透明性等无关性。

-
位置透明性
在RPC中,调用某一个过程的客户不能判断该过程是运行在同一个进程还是运行在不同的进程中或者运行在其他的机器上。客户端不需要知道位置。
-
通信协议
支持中间抽象的协议与下层传输协议无关,请求-应答协议可以在多种底层通信协议上完成.
-
计算机硬件
用于外部数据表示的两种公认标准。消息解码和编码,隐藏了由于硬件体系结构差异的不同。
-
操作系统
中间件提供的更高级的抽象和基本的操作系统无关。
接口
编程模型中可以把一个程序组成一系列能彼此通信的模块。
模块之间的通信可以采用模块间的过程调用或者直接访问模块中的一个变量。
为了控制模块之间可能的交互,必须为每一个模块定义显示的接口,模块接口指定了可供其他模块访问过程和变量。
模块实现后就隐藏了除通过其接口可获得的信息之外的所有信息。
模块接口保持相同,实现的改变就不会影响模块的使用者。
分布式系统接口
在分布式系统中,模块可能运行在彼此独立的进程中或者机器。
进程间的变量共享不可实现,因此定义RPC & RMI的模块的接口不能指定对变量的直接访问。
当过程及其调用者分布在不同的进程中,用于本地调用的值调用和引用调用等参数传递机制就不在适用。
在分布式程序中,模块接口中的过程或方法的规约把参数描述为输入和输出。
输入参数被传递给远程模块,先通过请求消息发送参数的值,然后将这些值提供给服务器作为操作执行的参数。
输出参数在应答消息中返回,可以作为调用的结果或者替换调用环境中的值。
当一个消息即输入又输出,则必须包含在请求和应答中。
分布式接口不适合传递指针,也不能返回。
- 服务接口:客户-服务模式下,每个服务提供一系列客户使用的过程(例如,文件服务器会提供读写文件的过程),术语服务接口是指由服务器提供的过程规约,定义过程的输入和输出参数类型。
- 远程接口:在分布式对象模型中,远程接口指定了可供其他进程中对象进行调用的对象的方法,定义了每个方法的输入输出参数的类型。远程的接口可以把对象作为参数传递或者作为方法的结果传递,也可以传递对象的引用。
- 引用的概念不能和指针混淆,指针是指特定的内存地址。
接口定义语言 IDL
RMI机制可以集成到某个编程语言中,如果语言包含了适当的定义接口的表示方法,就允许将输入和输出参数映射成该语言中正常使用的参数。
分布式对象间通信
对象模型
面向对象编程方式是将数据和方法组织到对象中,对象之间通信的方法就是调用方法,传递参数和接收结果。
对象可以封装数据和方法的代码。面向对象语言允许直接定义共享变量对象。
在分布式系统中数据只能通过其方法提供。
对象引用
访问一个对象可以通过对象的引用,调用一个对象需要提供引用和方法名和需要传递的参数。
一个变量也可能只是拥有一个对象的引用。
对象引用可以作为参数,赋值或返回结果进行。
接口
接口在无需规定其实现的情况下提供了一系列标记方法的定义(参数类型,返回值,异常等)
如果对象包含了实现接口方法的代码,对象必须提供特定接口进行调用。
类可以实现多个接口或者一组接口,
接口提供参数类型,异常类型,变量类型和返回值类型,但不提供构造函数。
在 Java 中,接口是一种特殊的抽象类,它只包含常量和抽象方法。接口没有构造函数的原因是因为接口中的方法都是抽象的,没有具体的实现,因此不需要构造函数来初始化实例变量。
接口的主要作用是定义一组公共的方法,让不同的类实现这些方法来达到相同的目的。接口中定义的方法都是抽象的,没有实现,因此接口不能直接被实例化。只有实现了接口的类才能被实例化,而且必须实现接口中的所有方法。
因为接口没有实例变量,所以没有必要在接口中定义构造函数。接口的实现类必须提供一个公共的默认构造函数,用于实例化对象。当然,实现类也可以定义其他的构造函数,但是这些构造函数不能被接口调用。
总之,接口是一种特殊的抽象类,它只包含常量和抽象方法,没有实例变量,因此不需要构造函数来初始化实例变量。
在JDK17
新增sealed
和permits的作用是为了限制继承层次结构,防止继承层次结构变得过于复杂和不可控。通过使用sealed和permits`,可以明确地定义哪些类可以继承一个受限制的类,使得继承层次结构更加清晰和可维护。
动作
在OOP中,动作是由对象启动的,一个对象发出调用到另一个对象。
发出调用所需要的信息比如参数的传递。
接受者采用适当的执行方法,然后将控制返回给调用对象,如果有返回值则会返回一个结果:
- 执行动作可能改变接受者的状态
- 可能会触发其他对象的链接调用,对象中调用链
一连串的调用最终返回,其中并没有解释异常的发生。
怀疑自己是不是合格的程序设计者就出于此处!
异常
异常是一种在不增加代码复杂度的情况下处理程序因未预测到的异常情况下处理问题的手段。
设计方法的时候提供了一系列的方法异常标题,调用者方法需要自己处理这个问题。
如果出现异常意味着程序的控制将转移到异常对象中,控制不会再返回抛出异常的地方。
无用单元回收
GC算法实现处理已经不在引用对象的占用空间。
分布式对象
对象的状态由实例变量值组成。
在基于对象的模型中,程序的模型被划分为几个独立的部分,每个部分都与一个对象关联。
基于对象的程序在逻辑上是分区的,在分布式系统中对象可以通过分布在不同的物理机机器进程中。
分布式对象模型
每个进程包含若干的对象,有些能接收远程和本地调用。
不同进程的对象调用是远程调用,同一进程中的调用时本地调用。

分布式对象模型的设计核心:
- 远程对象引用:如果其他对象能够访问远程对象的某个对象的引用,那么就可以调用这个远程对象上的方法。
- 远程接口:每个远程对象都有一个远程对象的接口,由该接口描述哪些方法提供给远程调用的。
分布式对象系统中的动作
在分布式系统中涉及到方法调用链的对象可能处于不同的进程中或者不同的计算机中。
当调用跨越了计算机和进程的边界的时候,就需要使用RMI,使用RMI的前提是,对象的远程引用必须是可用的。
分布式系统的无用单元回收
分布式系统中的无用单元回收是指在系统运行过程中,由于系统中的各个节点会产生大量的无用单元(例如无用的对象、文件等),这些无用单元会占用大量的系统资源,严重影响系统性能和稳定性。为了解决这个问题,需要对无用单元进行回收和清理。
分布式系统的无用单元回收一般分为两种方式:
- 基于引用计数的垃圾回收
这种方式是在系统中维护一个引用计数器,记录每个对象被引用的次数。当对象的引用计数为0时,就可以将其回收。这种方式在分布式系统中的应用比较广泛,但是由于需要维护引用计数,可能会影响系统性能。
- 基于标记-清除的垃圾回收
这种方式是在系统中进行标记和清除操作,首先标记所有可以访问到的对象,然后清除所有未被标记的对象。这种方式对于分布式系统来说更加适用,因为它可以跨越多个节点进行回收,同时也可以避免引用计数带来的性能问题。
分布式系统异常
分布式系统的异常处理机制通常包括以下几个方面:
- 异常检测:分布式系统需要实时检测异常,包括节点故障、网络故障等。可以通过心跳检测、超时机制、重试机制等方法来实现。
- 异常处理:发生异常时,需要快速响应并进行相应的处理,比如节点故障时需要重新分配任务或启动备份节点等。异常处理的具体方式根据系统的不同而有所不同。
- 异常恢复:当分布式系统发生异常时,需要能够快速恢复正常状态,比如自动切换到备份节点、重新分配任务等。异常恢复需要考虑到数据的一致性和可靠性。
- 日志记录:分布式系统需要记录异常日志,以便于后续的分析和调试。日志记录可以帮助开发人员快速定位问题并进行解决。
设计问题
RMI调用语义
- 引用透明性:RMI调用应该像本地方法调用一样透明,调用者不需要关心方法调用是在本地还是在远程执行。
- 远程对象的生命周期管理:RMI提供了一种机制来管理远程对象的生命周期,确保远程对象的创建和销毁都能正确处理。
- 参数传递和返回值:RMI支持在远程调用中传递和返回各种数据类型的参数,包括Java对象。
- 异常处理:RMI支持在远程调用期间捕获和处理异常,可以抛出本地异常和远程异常。
- 安全性:RMI提供了一些安全机制来保护远程调用的安全性,包括身份验证和授权等。
-
或许调用语义:调用者不能判断一个远程方法是已经执行过一次还是从来没有执行过。
- 可以偶然接收调用失败的应用可用——OPENAI
-
至少一次调用语义:调用者或许可以接收到一次执行结果,调用者知道至少执行了一次,或者接收到一个异常通知执行结果。通过重发消息实现至少一次语义。
-
最多一次调用语义:调用者接收到一个返回结果,调用者知道方法执行了一次或者接收一个异常告知方法执行异常。
- 要么执行一次,要么没有执行。
实现

通信模块
两个相互协作的通信模块实现客户和服务器之间的请求-应答的信息传递。
通信模块:消息类型,请求id,请求对象的远程引用。
远程引用模块
负责翻译本地和远程对象引用以及创建远程对象引用。
每个进程的都保存远程对象引用表,记录着该进程中的对象应用和远程系统的对象引用。
该进程拥有的所有的远程对象的引用表项。
每个本地代理的表项。
当远程对象第一次作为结果或者参数传递,要求远程引用模块创建一个远程对象引用,并将其保存在表中。
当远程对象引用随请求或应答消息到达,远程引用模块提供对应的本地对象的应用。
- 可以指向一个代理或者一个其他的对象
- 如果不在表中,RMI就会创建一个新的远程对象引用,并保存。
RMI软件
应用层对象和通信模块,远程引用模块之间的软件组成。
-
代理:表现的和远程对象一样的的调用,远程客户调用透明,隐藏其中和远程对象交互的细节。
- 代理中的每个方法会把一个目标对象的引用,自身的id和请求的参数编码进请求消息,一起发送到目标。等待应答,然后解码将结果返回给调用者。
-
调度程序:服务器对表示远程对象的每个类都有一个调度程序和骨架;
- 调度程序接收通信模块传递的消息,通过ID找到骨架中对象的方法执行。
- 调度程序和代理程序中的ID相同。
-
骨架:远程对象中用于实现接口调用的方法。
- 骨架方法解码请求中的参数,找到远程对象中执行的方法。
- 等待调用完成,将结果或任何异常编码进入应答消息,发送给代理方法。
事件和通知
基本原因是希望描述一个对象能够对另一个对象发生的改变做出反应。
本质上是异步的,并且取决于接受者的对于该时间的响应方式。
发布-订阅模型是在分布式系统中对本地事件的一种扩展模型。
生成事件的对象发布事件的类型,其他订阅了该事件类型的观察者接收该类型的事件。
- 异构性:当事件通知作为一种分布式系统对象间的通信方式,分布式组件原本不是设计用于交互的,依然可以简单的集成在一起工作。主要是生成事件增加新的事件类型,订阅者处理该类型的时间通知。
- 异步性:生成事件异步将消息传输给所有的订阅者,避免和每个订阅者同步通信,也太复杂处理了。
- 订阅者和经历事件是去耦合。
分布式事件通知的参与者


- 兴趣对象:经历操作被改变状态的对象。该状态改变可能引起其他对象感兴趣。
- 事件:发生在兴趣对象上,作为方法执行完成的结果。
- 通知:包含事件类型和属性(兴趣对象标识符,调用的方法,发生时间或者一个序列号)
- 订阅者:一个对象,订阅另一个对象的某些类型的事件,并接收关于这些事件的通知。
- 观察者对象:将兴趣对象和其订阅者之间的关系去耦合。
- 一个兴趣对象可能具有不同兴趣的不同订阅者。
- 一个或多个观察者对象可以介入到兴趣对象和订阅对象之间。
- 发布者:声明将要生产某种类型的事件。发布者可能是兴趣对象或者一个观察者。
传递语义
为通知提供不同的传输抱保障,基于不用的网络通信协议可以完成。
观察者的作用
可以从兴趣对象传输通知到接受者,期间可能经历多个进程,经历多个不同观察者的进程中。
- 转发:观察者可以作为一个或多个兴趣对象完成通知转发工作。
- 过滤:based-conditon handle the message
- 事件模式:当对象订阅一个兴趣对象上的事件,可以说明感兴趣事件的模式。
- 通知邮箱:扮演订阅者的角色暂时接收消息。
相关文章:
分布式系统概念和设计-分布式对象和远程调用
分布式系统概念和设计 分布式对象和远程调用 能够接收远程方法调用的对象称为远程对象,远程对象实现一个远程接口。 调用者和被调用对象分别存在不同的失败可能性,RMI和本地调用有不同的语义。 中间件 在进程和消息传递等基本构造模块之上提供编程模型的…...
11-FastDFS
一 为什么要使用分布式文件系统 单机时代 初创时期由于时间紧迫,在各种资源有限的情况下,通常就直接在项目目录下建立静态文件夹,用于用户存放项目中的文件资源。如果按不同类型再细分,可以在项目目录下再建立不同的子目录来区分…...
Word这样用,提高效率不加班
Word这样用,提高效率不加班 今天给大家分享23条Word文档的应用小技巧。对于大家来说,掌握些技巧能够效率百倍,何乐不为? 这些技巧是本人通过整理一直在用并且使用频率较高的,也希望能帮到大家。有兴趣的小伙伴可以自己…...
【Linux】调试器---gdb的使用
文章目录 一.背景知识二.安装gdb三.gdb的用法使用须知gdb的常用指令1.进入调试2.退出调试操作3.显示源代码4.设置断点breakPoint5.查看断点信息/禁用断点/开启断点/删除断点6.运行程序,开始调试run7.查看变量8.其它重要命令 一.背景知识 程序的发布方式有两种&…...
MySQL数据库之表的增删改查(进阶)
目录 1. 数据库约束1.1 约束类型1.2 NULL约束1.3 UNIQUE:唯一约束1.4 DEFAULT:默认值约束1.5 PRIMARY KEY:主键约束1.6 FOREIGN KEY:外键约束1.7 CHECK约束 2 表之间的关系2.1 一对一2.2 一对多2.3 多对多 3 新增4 查询4.1 聚合查…...
Nginx从开始到结束,简单到小白都能懂哦
绪论 大家好,很高兴能够为大家带来这篇关于Nginx配置的新手指南。在这篇博客中,我们将通过简单明了的图文教程,帮助大家快速上手Nginx配置,解锁Nginx的各种神奇功能! 一、Nginx简介 Nginx是一款功能强大的web服务器…...
Qt——Qt控件之按钮-QDialogButtonBox对话框按钮盒子控件的使用总结(例程:自定义按钮)
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C++语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实战》...
数据库学习-常用的SQL语句
背景: 汇整一下自己学习数据库过程中常见的题目及语句。 一.实例分析题 二.简单SQL查询: 1):统计每个部门员工的数目select dept,count(*) from employee group by dept;2):统计每个部门员工的数目大于一个的记录se…...
5种获取JavaScript时间戳函数的方法
5种获取JavaScript时间戳函数的方法 一、JavasCRIPT时间转时间戳方法一:Date.now()方法二:Date.parse()方法三:valueOf()方法四:getTime()方法五:Number 二、js时间戳转时间方法一:生成2022/1/18 上午10:09…...
图的宽度优先遍历
文章目录 图的宽度优先遍历程序设计程序分析图的宽度优先遍历 【问题描述】根据输入图的邻接矩阵A,给出图的宽度优先遍历序列; 【输入形式】第一行为图的结点个数n,第二行输入顶点的信息,每个顶点用一个字符表示,接下来的n行为图的邻接矩阵A。其中A[i][j]=1表示两个结点邻…...
企业AD域(域控服务器)的安装和配置详细教程
一、环境以及工具准备 软件:VMWare Workstation 2016 ( 下载链接:https://pan.baidu.com/s/1iX1VRilerYPGbGvX4pvaKw 提取码:75R6 ) 镜像:Windows Server 2016 ( 下载地址ÿ…...
面试官:一千万的数据,你是怎么查询的?
面试官:一千万的数据,你是怎么查询的? 1 先给结论 对于1千万的数据查询,主要关注分页查询过程中的性能 针对偏移量大导致查询速度慢: 先对查询的字段创建唯一索引 根据业务需求,先定位查询范围(…...
IntelliJ 上 Azure Event Hubs 全新支持来了!
大家好,欢迎来到 Java on Azure Tooling 的3月更新。在这次更新中,我们将介绍 Azure Event Hubs 支持、Azure Functions 的模板增强,以及在 IntelliJ IDEA 中部署 Azure Spring Apps 时的日志流改进。要使用这些新功能,请下载并安…...
性能测试,监控磁盘读写iostat
性能测试,监控磁盘读写iostat iostat是I/O statistics(输入/输出统计)的缩写,iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出 CPU使用情况。同vmstat一样,ios…...
steam游戏搬砖项目怎么做?月入过万的steam搬砖项目教程拆解
steam游戏搬砖项目怎么做?月入过万的steam搬砖项目教程拆解 大家好,我是童话姐姐,今天继续来聊Steam搬砖项目。 Steam搬砖项目也叫CSGO搬砖项目,它并不是什么刚面世的新项目,是已经存在至少七八年的一个资深老牌项目。这个项目…...
协同运力、算力、存力,加速迈向智能世界
2023年4月20日,华为在HAS2023期间举办“迈向智能世界”主题论坛,吸引了来自全球的分析师、专家学者及媒体与会。会上,华为ICT战略与Marketing总裁彭松发表了“持续技术创新,加速迈向智能世界”的主题演讲。 华为ICT战略与Marketin…...
被裁员了,要求公司足额补缴全部公积金,一次补了二十多万!网友兴奋了,该怎么操作?...
被裁员后,能要求公司补缴公积金吗? 一位网友问: 被裁员了,要求公司把历史公积金全部足额缴纳,现在月薪2.3万,但公司每个月只给自己缴纳300元公积金,结果一次补了二十多万,一次性取出…...
家庭智能插座一Homekit智能
传统的灯泡是通过手动打开和关闭开关来工作。有时,它们可以通过声控、触控、红外等方式进行控制,或者带有调光开关,让用户调暗或调亮灯光。 智能灯泡内置有芯片和通信模块,可与手机、家庭智能助手、或其他智能硬件进行通信&#x…...
什么是雪花算法?啥原理?
1、SnowFlake核心思想 SnowFlake 算法,是 Twitter 开源的分布式 ID 生成算法。 其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 ID。在分布式系统中的应用十分广泛,且 ID 引入了时间戳,基本上保持自增的…...
【华为OD机试真题】 统计差异值大于相似值二元组个数(javapython)
统计差异值大于相似值二元组个数 知识点数组进制转换Q整数范围循环 时间限制:1s空间限制:256MB限定语言:不限 题目描述: 题目描述:对于任意两个正整数A和B,定义它们之间的差异值和相似值: 差异值:A、B转换成二进制后,对于二进制的每一位,对应位置的bit值不相同则为…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
