分布式系统概念和设计-分布式对象和远程调用

news2024/11/26 10:44:59

分布式系统概念和设计

分布式对象和远程调用

能够接收远程方法调用的对象称为远程对象,远程对象实现一个远程接口。

调用者和被调用对象分别存在不同的失败可能性,RMI和本地调用有不同的语义。

  1. 中间件

    在进程和消息传递等基本构造模块之上提供编程模型的软件为中间件。中间层使用基于进程通信消息的协议提供更高级的抽象,如远程调用和事件。重要作用是提供位置透明性等无关性。
    在这里插入图片描述

  2. 位置透明性

    在RPC中,调用某一个过程的客户不能判断该过程是运行在同一个进程还是运行在不同的进程中或者运行在其他的机器上。客户端不需要知道位置。

  3. 通信协议

    支持中间抽象的协议与下层传输协议无关,请求-应答协议可以在多种底层通信协议上完成.

  4. 计算机硬件

    用于外部数据表示的两种公认标准。消息解码和编码,隐藏了由于硬件体系结构差异的不同。

  5. 操作系统

    中间件提供的更高级的抽象和基本的操作系统无关。

接口

编程模型中可以把一个程序组成一系列能彼此通信的模块。

模块之间的通信可以采用模块间的过程调用或者直接访问模块中的一个变量。

为了控制模块之间可能的交互,必须为每一个模块定义显示的接口,模块接口指定了可供其他模块访问过程和变量。

模块实现后就隐藏了除通过其接口可获得的信息之外的所有信息。

模块接口保持相同,实现的改变就不会影响模块的使用者。

分布式系统接口

在分布式系统中,模块可能运行在彼此独立的进程中或者机器。

进程间的变量共享不可实现,因此定义RPC & RMI的模块的接口不能指定对变量的直接访问。

当过程及其调用者分布在不同的进程中,用于本地调用的值调用和引用调用等参数传递机制就不在适用。

在分布式程序中,模块接口中的过程或方法的规约把参数描述为输入和输出。

输入参数被传递给远程模块,先通过请求消息发送参数的值,然后将这些值提供给服务器作为操作执行的参数。

输出参数在应答消息中返回,可以作为调用的结果或者替换调用环境中的值。

当一个消息即输入又输出,则必须包含在请求和应答中。

分布式接口不适合传递指针,也不能返回。

  • 服务接口:客户-服务模式下,每个服务提供一系列客户使用的过程(例如,文件服务器会提供读写文件的过程),术语服务接口是指由服务器提供的过程规约,定义过程的输入和输出参数类型。
  • 远程接口:在分布式对象模型中,远程接口指定了可供其他进程中对象进行调用的对象的方法,定义了每个方法的输入输出参数的类型。远程的接口可以把对象作为参数传递或者作为方法的结果传递,也可以传递对象的引用。
  • 引用的概念不能和指针混淆,指针是指特定的内存地址。

接口定义语言 IDL

RMI机制可以集成到某个编程语言中,如果语言包含了适当的定义接口的表示方法,就允许将输入和输出参数映射成该语言中正常使用的参数。

分布式对象间通信

对象模型

面向对象编程方式是将数据和方法组织到对象中,对象之间通信的方法就是调用方法,传递参数和接收结果。

对象可以封装数据和方法的代码。面向对象语言允许直接定义共享变量对象。

在分布式系统中数据只能通过其方法提供。

对象引用

访问一个对象可以通过对象的引用,调用一个对象需要提供引用和方法名和需要传递的参数。

一个变量也可能只是拥有一个对象的引用。

对象引用可以作为参数,赋值或返回结果进行。

接口

接口在无需规定其实现的情况下提供了一系列标记方法的定义(参数类型,返回值,异常等)

如果对象包含了实现接口方法的代码,对象必须提供特定接口进行调用。

类可以实现多个接口或者一组接口,

接口提供参数类型,异常类型,变量类型和返回值类型,但不提供构造函数。

在 Java 中,接口是一种特殊的抽象类,它只包含常量和抽象方法。接口没有构造函数的原因是因为接口中的方法都是抽象的,没有具体的实现,因此不需要构造函数来初始化实例变量。

接口的主要作用是定义一组公共的方法,让不同的类实现这些方法来达到相同的目的。接口中定义的方法都是抽象的,没有实现,因此接口不能直接被实例化。只有实现了接口的类才能被实例化,而且必须实现接口中的所有方法。

因为接口没有实例变量,所以没有必要在接口中定义构造函数。接口的实现类必须提供一个公共的默认构造函数,用于实例化对象。当然,实现类也可以定义其他的构造函数,但是这些构造函数不能被接口调用。

总之,接口是一种特殊的抽象类,它只包含常量和抽象方法,没有实例变量,因此不需要构造函数来初始化实例变量。

在JDK17

新增sealedpermits的作用是为了限制继承层次结构,防止继承层次结构变得过于复杂和不可控。通过使用sealedpermits`,可以明确地定义哪些类可以继承一个受限制的类,使得继承层次结构更加清晰和可维护。

动作

在OOP中,动作是由对象启动的,一个对象发出调用到另一个对象。

发出调用所需要的信息比如参数的传递。

接受者采用适当的执行方法,然后将控制返回给调用对象,如果有返回值则会返回一个结果:

  • 执行动作可能改变接受者的状态
  • 可能会触发其他对象的链接调用,对象中调用链

一连串的调用最终返回,其中并没有解释异常的发生。

怀疑自己是不是合格的程序设计者就出于此处!

异常

异常是一种在不增加代码复杂度的情况下处理程序因未预测到的异常情况下处理问题的手段。

设计方法的时候提供了一系列的方法异常标题,调用者方法需要自己处理这个问题。

如果出现异常意味着程序的控制将转移到异常对象中,控制不会再返回抛出异常的地方。

无用单元回收

GC算法实现处理已经不在引用对象的占用空间。

分布式对象

对象的状态由实例变量值组成。

在基于对象的模型中,程序的模型被划分为几个独立的部分,每个部分都与一个对象关联。

基于对象的程序在逻辑上是分区的,在分布式系统中对象可以通过分布在不同的物理机机器进程中。

分布式对象模型

每个进程包含若干的对象,有些能接收远程和本地调用。

不同进程的对象调用是远程调用,同一进程中的调用时本地调用。

在这里插入图片描述

分布式对象模型的设计核心:

  • 远程对象引用:如果其他对象能够访问远程对象的某个对象的引用,那么就可以调用这个远程对象上的方法。
  • 远程接口:每个远程对象都有一个远程对象的接口,由该接口描述哪些方法提供给远程调用的。
分布式对象系统中的动作

在分布式系统中涉及到方法调用链的对象可能处于不同的进程中或者不同的计算机中。

当调用跨越了计算机和进程的边界的时候,就需要使用RMI,使用RMI的前提是,对象的远程引用必须是可用的。

分布式系统的无用单元回收

分布式系统中的无用单元回收是指在系统运行过程中,由于系统中的各个节点会产生大量的无用单元(例如无用的对象、文件等),这些无用单元会占用大量的系统资源,严重影响系统性能和稳定性。为了解决这个问题,需要对无用单元进行回收和清理。

分布式系统的无用单元回收一般分为两种方式:

  1. 基于引用计数的垃圾回收

这种方式是在系统中维护一个引用计数器,记录每个对象被引用的次数。当对象的引用计数为0时,就可以将其回收。这种方式在分布式系统中的应用比较广泛,但是由于需要维护引用计数,可能会影响系统性能。

  1. 基于标记-清除的垃圾回收

这种方式是在系统中进行标记和清除操作,首先标记所有可以访问到的对象,然后清除所有未被标记的对象。这种方式对于分布式系统来说更加适用,因为它可以跨越多个节点进行回收,同时也可以避免引用计数带来的性能问题。

分布式系统异常

分布式系统的异常处理机制通常包括以下几个方面:

  1. 异常检测:分布式系统需要实时检测异常,包括节点故障、网络故障等。可以通过心跳检测、超时机制、重试机制等方法来实现。
  2. 异常处理:发生异常时,需要快速响应并进行相应的处理,比如节点故障时需要重新分配任务或启动备份节点等。异常处理的具体方式根据系统的不同而有所不同。
  3. 异常恢复:当分布式系统发生异常时,需要能够快速恢复正常状态,比如自动切换到备份节点、重新分配任务等。异常恢复需要考虑到数据的一致性和可靠性。
  4. 日志记录:分布式系统需要记录异常日志,以便于后续的分析和调试。日志记录可以帮助开发人员快速定位问题并进行解决。
设计问题
RMI调用语义
  1. 引用透明性:RMI调用应该像本地方法调用一样透明,调用者不需要关心方法调用是在本地还是在远程执行。
  2. 远程对象的生命周期管理:RMI提供了一种机制来管理远程对象的生命周期,确保远程对象的创建和销毁都能正确处理。
  3. 参数传递和返回值:RMI支持在远程调用中传递和返回各种数据类型的参数,包括Java对象。
  4. 异常处理:RMI支持在远程调用期间捕获和处理异常,可以抛出本地异常和远程异常。
  5. 安全性:RMI提供了一些安全机制来保护远程调用的安全性,包括身份验证和授权等。
  • 或许调用语义:调用者不能判断一个远程方法是已经执行过一次还是从来没有执行过。

    • 可以偶然接收调用失败的应用可用——OPENAI
  • 至少一次调用语义:调用者或许可以接收到一次执行结果,调用者知道至少执行了一次,或者接收到一个异常通知执行结果。通过重发消息实现至少一次语义。

  • 最多一次调用语义:调用者接收到一个返回结果,调用者知道方法执行了一次或者接收一个异常告知方法执行异常。

    • 要么执行一次,要么没有执行。
实现

在这里插入图片描述

通信模块

两个相互协作的通信模块实现客户和服务器之间的请求-应答的信息传递。

通信模块:消息类型,请求id,请求对象的远程引用。

远程引用模块

负责翻译本地和远程对象引用以及创建远程对象引用。

每个进程的都保存远程对象引用表,记录着该进程中的对象应用和远程系统的对象引用。

  • 该进程拥有的所有的远程对象的引用表项。

  • 每个本地代理的表项。

  • 当远程对象第一次作为结果或者参数传递,要求远程引用模块创建一个远程对象引用,并将其保存在表中。

  • 当远程对象引用随请求或应答消息到达,远程引用模块提供对应的本地对象的应用。

    • 可以指向一个代理或者一个其他的对象
    • 如果不在表中,RMI就会创建一个新的远程对象引用,并保存。
RMI软件

应用层对象和通信模块,远程引用模块之间的软件组成。

  • 代理:表现的和远程对象一样的的调用,远程客户调用透明,隐藏其中和远程对象交互的细节。

    • 代理中的每个方法会把一个目标对象的引用,自身的id和请求的参数编码进请求消息,一起发送到目标。等待应答,然后解码将结果返回给调用者。
  • 调度程序:服务器对表示远程对象的每个类都有一个调度程序和骨架;

    • 调度程序接收通信模块传递的消息,通过ID找到骨架中对象的方法执行。
    • 调度程序和代理程序中的ID相同。
  • 骨架:远程对象中用于实现接口调用的方法。

    • 骨架方法解码请求中的参数,找到远程对象中执行的方法。
    • 等待调用完成,将结果或任何异常编码进入应答消息,发送给代理方法。

事件和通知

基本原因是希望描述一个对象能够对另一个对象发生的改变做出反应。

本质上是异步的,并且取决于接受者的对于该时间的响应方式。

发布-订阅模型是在分布式系统中对本地事件的一种扩展模型。

生成事件的对象发布事件的类型,其他订阅了该事件类型的观察者接收该类型的事件。

  • 异构性:当事件通知作为一种分布式系统对象间的通信方式,分布式组件原本不是设计用于交互的,依然可以简单的集成在一起工作。主要是生成事件增加新的事件类型,订阅者处理该类型的时间通知。
  • 异步性:生成事件异步将消息传输给所有的订阅者,避免和每个订阅者同步通信,也太复杂处理了。
    • 订阅者和经历事件是去耦合。
分布式事件通知的参与者

在这里插入图片描述
在这里插入图片描述

  • 兴趣对象:经历操作被改变状态的对象。该状态改变可能引起其他对象感兴趣。
  • 事件:发生在兴趣对象上,作为方法执行完成的结果。
  • 通知:包含事件类型和属性(兴趣对象标识符,调用的方法,发生时间或者一个序列号)
  • 订阅者:一个对象,订阅另一个对象的某些类型的事件,并接收关于这些事件的通知。
  • 观察者对象:将兴趣对象和其订阅者之间的关系去耦合。
    • 一个兴趣对象可能具有不同兴趣的不同订阅者。
    • 一个或多个观察者对象可以介入到兴趣对象和订阅对象之间。
  • 发布者:声明将要生产某种类型的事件。发布者可能是兴趣对象或者一个观察者。
传递语义

为通知提供不同的传输抱保障,基于不用的网络通信协议可以完成。

观察者的作用

可以从兴趣对象传输通知到接受者,期间可能经历多个进程,经历多个不同观察者的进程中。

  • 转发:观察者可以作为一个或多个兴趣对象完成通知转发工作。
  • 过滤:based-conditon handle the message
  • 事件模式:当对象订阅一个兴趣对象上的事件,可以说明感兴趣事件的模式。
  • 通知邮箱:扮演订阅者的角色暂时接收消息。

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

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

相关文章

PDCA循环模型——如何用同样的时间做更多的事?【No.1 】

PDCA循环模型,又称戴明环,是一个持续改进模型。PDCA循环包括以下内容: Plan阶段:确认目标,制定计划Do阶段:执行措施和计划Check阶段:检查验证,评估效果Action阶段:有效措…

健哥MYSQL私房菜 - 基础与介绍

前言 从今天开始, 健哥就带各位小伙伴学习数据库技术。数据库技术是Java开发中必不可少的一部分知识内容。也是非常重要的技术。本系列教程由浅入深, 全面讲解数据库体系。 非常适合零基础的小伙伴来学习。 ------------------------------前戏已做完,精彩即开始---…

docker-compose详讲

一、概述 docker-compose 项目是docker官方的开源项目, 负责实现对docker容器集群的快速编排,来轻松高效的管理容器,定义运行多个容器。 docker-compose将所管理的容器分为三层, 分别是工程(project)&#…

C#,码海拾贝(19)——一般实矩阵的QR分解(QR Decomposition)方法之C#源代码,《C#数值计算算法编程》源代码升级改进版

1 实矩阵 实矩阵,指的是矩阵中所有的数都是实数的矩阵。如果一个矩阵中含有除实数以外的数,那么这个矩阵就不是实矩阵。 2 QR(正交三角)分解法 QR(正交三角)分解法是求一般矩阵全部特征值的最有效并广泛应…

基于Java+SpringBoot制作一个宿舍报修小程序

制作一个宿舍报修小程序,让学生实现快速报修,将流程进行精简, 便于管理部门有效响应。 微信小程序实战开发专栏 一、小程序1.1 项目创建1.2 首页iconfont图标引入1.3 报修管理报修提交报修记录报修溯源1.4 来访登记1.5 公告通知二、API2.1 Sp…

windows日志捕获工具-DebugView使用教程

debugview 是一款捕获windows桌面系统程序中由TRACE(debug版本)和OutputDebugString输出的信息。 1、双击打开DebugView.exe工具,看到如下界面: 其中这里 Include代表过滤想要的关键字,一般不会找自己想要的关键字日志就设置成星号*&#xf…

GDOUCTF WEB

web hate eat snake 游戏题找js,将判断语句删掉即可 ezweb 看源码找到/src路由,找到源码 import flaskapp flask.Flask(__name__)app.route(/, methods[GET]) def index():return flask.send_file(index.html)app.route(/src, methods[GET]) def so…

如何快速开发软件?这篇文章说明白了

随着经济迅速发展,传统软件开发模式存在研发周期长、需求转化困难、投入成本高等问题,无法适应当前业务发展速度,市场需要快速开发工具。快速开发软件可分为代码生成类、少代码类、零代码功能配置类。代码生成类相对灵活,但对用户要求高&…

MySQL group_concat设置group_concat_max_len

GROUP_CONCAT函数用于将多个字符串连接成一个字符串,在拼接成字符串时就会存在拼接长度的问题,mysql 默认的拼接最大长度为1024 个字节,由于1024个字节会出现不够用的情况,所以有时需要去根据情况进行修改,方式如下。 …

nginx启动、配置、测试(全网最全)

目录 一、要求 1.配置不同IP访问 2.配置不同端口访问 3.配置域名访问 二、前期准备 1.安装gcc g的依赖库 2.安装 pcre的依赖库 3.安装zlib的依赖库 4.安装openssl的依赖库 5.解压nginx的安装包 6.进入到解压的nginx安装目录里面 7.将nginx安装到/usr/local/下 8.编译 9.进入到…

从 Python 中的字典列表中删除重复项

要从字典列表中删除重复项: 使用字典推导来遍历列表。使用每个 id 属性的值作为键,使用字典作为值。使用 dict.values() 方法只获取唯一的字典。使用 list() 类将结果转换为列表。 list_of_dictionaries [{id: 1, site: jiyik.com},{id: 2, site: goo…

5G NR调制阶数与EVM关系以及对系统SNR要求分析

移动通信技术对数据传输速率要求越来越高。一种提高传输速率的思路是使用更高阶的QAM 调制方式,例如5G NR 的256QAM PDSCH,微波的1024QAM,2048QAM和4096QAM 调制。更高阶的QAM 调制方式对系统也提出了更高的要求。例如某个系统的EVM 测试结果…

微服务+springcloud+springcloud alibaba学习笔记【Hystrix(豪猪哥)的使用】(6/9)

Hystrix(豪猪哥)的使用 6/91、Hystrix熔断器概述2、HyStrix重要概念3、hystrix案例3.1 新建模块 Cloud-provider-hystrix-payment80013.2 创建带降级的order模块 Cloud-comsumer-feign-hystrix-order803.3 配置服务降级:3.3.1 服务降级 Cloud-provider-h…

企业做体系认证要警惕的8大问题,别再被不良认证机构忽悠啦!

企业资质认证要警惕这八大问题 企业资质真的很管用。我们都知道从事任何一个行业都需要准入证明,尤其是招投标企业,企业资质更是投标的准入门槛,并且在投标中还可以为企业加分。 有些资质如ISO三体系是企业必备的资质之一,也是常…

麻了,不要再动不动就BeanUtil.copyProperties

前言 最近项目上要求升级一个工具包hutool的版本,以解决安全漏洞问题,这不升级还好,一升级反而捅出了更大的篓子,究竟是怎么回事呢? 事件回顾 我们项目原先使用的hutool版本是5.7.2,在代码中&#xff0c…

Hudi集成Flink-写入方式

文章目录一、CDC 入湖1.1、[开启binlog](https://blog.csdn.net/wuxintdrh/article/details/130142601)1.2、创建测试表1.2.1、创建mysql表1.2.2、将 binlog 日志 写入 kafka1、使用 mysql-cdc 监听 binlog2、kafka 作为 sink表3、写入sink 表1.2.3、将 kakfa 数据写入hudi1、k…

ERTEC200P-2 PROFINET设备完全开发手册(4-2)

4.2 XHIF接口实验 4.2.1写入单片机固件 首先按照下图连接设备 用JLINK 20Pin JTAG连接4 Pin SWD可以采用转接板 单片机的参考程序是用ST的CubeIDE生成的,目前的版本是1.7.0。打开安装后的CubeIDE,在菜单中选择“File->Import“ 选择“Existing Proj…

企业信息化建设都包括哪些方面?

随着大数据技术的发展,时代的发展要求企业转变管理模式、建立信息化管理机制,同时也是提高工作、管理效率,促进企业战略性发展的重要保障。 企业信息化是将信息技术应用于企业发展实践中的一个动态过程,即通过挖掘先进的管理理念…

高可靠多层板制造服务再获认可!华秋荣获创想三维优秀质量奖

4月10日,创想三维2023年度战略供应商大会在惠州成功举办,高可靠多层板制造商华秋出席了本次活动并取得了《优秀质量奖》一奖项。 大会现场,创想三维董事长陈春指出公司的持续发展与供应链高质量的交付息息相关。作为创想三维主力PCB供应商&am…

【亲测有效】更新了WIN11之后 右键无 新建WORD,PPT,EXCEL 选项 问题 解决方案

原本正常的正版系统,在昨天4月自动更新安装之后,发现右键找 不到新建文档了,word,ppt,excel都不见了。 看了网上大神的方法 Win11安装了Office右键没有新建Excel选项怎么办? - 知乎 可以解决一部分 官方解决方案,亲…