RPC、RMI与MOM与组播 通信原理 .

远程过程调用(RPC):

即对远程站点机上的过程进行调用。当站点机A上的一个进程调用另一个站点机上的过程时,A上的调用进程挂起,B上的被调用过程执行,并将结果返回给调用进程,使调用进程继续执行【B上的被调用过程的参数和执行结果在调用和被调用进程之间是通过消息传递来实现的,表现为C/S关系】

为实现不同站点机上的RPC,调用和被调用进程各方都要保留一个用于存放过程参数和执行结果的运行栈,分别称为客户和服务器的存根,为各自不同地址空间上的运行提供支持。

实现步骤【对外是透明的】:

1.调用客户存根,填参数。

2.客户存根打包参数消息,调用客户机操作系统。

3.客户机操作系统向远程服务器操作系统发送消息,客户进程等待返回结果。

4.服务器操作系统接收参数消息并伟给服务器存根。

5.服务器存根解包参数消息,启动服务器进程。

6.服务器进程执行完成,将结果填入给服务器存根。

7.服务器存根打包结果消息,调用服务器操作系统。

8.服务器操作系统发送结果消息到客户机操作系统。

9客户机操作系统接收结果消息,并传给客户进程。

10.客户存根解包结果消息,返回给客户进程。

进程方法调用(RMI):

它可以被看作是RPC的Java版本。但是传统RPC并不能很好地应用于分布式对象系统。而Java RMI 则支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。客户要访问一个远程对象时,首先要与该对象进行绑定,对象引用包含足够的信息实现实现这种对象绑定,绑定的结果就是在进程的地址究竟内生成一个对象代理。对象代理的界面与对象本身的界面完全一样。【多数情况下这种绑定是由系统自动完成的,对用户是透明的】

rmi结构图

工作原理:方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上经传输层和远程调用层返回。最后,占位程序获得返回值。【客户进程在访问一个分布式对象之前,首先要在该进程的局部地址空间内生成一个该对象的代理,对象代理可作为客户进程的局部对象使用,其功能类似于RPC中的客户存根,可以将客户的访问请求和参数打包成消息,发送给服务器,由服务器方相应的存根解包消息后调用对应方法】序列化和反序列化

实现步骤:

 1、生成一个远程接口 

 2、实现远程对象(服务器端程序) 

 3、生成占位程序和骨干网(服务器端程序) 

 4、编写服务器程序 

 5、编写客户程序 

 6、注册远程对象 

 7、启动远程对象

缺点:RPC和RMI都要求调用方和被调用方的进程处于执行状态。如果被调用过程或者对象所处的站点处于停机或故障状态,则RMI或RPC调用失败。

面向消息的通信:

为克服RMI和RPC的上述缺点,其采用持久通信模式,在发送方发送消息时,不要求接收方进程正在运行;在接收方进程接收消息时,不要求发送方进程也在工作。应用A需要发送一个消息给位于不同站点机的另一个应用B,首先调用消息队列接口将该消息发给与之相连的通信服务器,放入消息队列A,再由队列管理器将引消息通过底层网络发送给与接收方站点机相连接的通信服务器,放入消息队列B。在接收方,应用B调用消息队列接口从本地的队列B中取得消息。

面向消息的中间件:MOM 指的是利用高效可靠的消息传递机制【消息队列】进行平台无关的数据交流,是一种持久异步通信系统,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可在分布环境下扩展进程间的通信,并支持多通讯协议、语言、应用程序、硬件和软件平台。目前流行的MOM 中间件产品有IBM 的MQSeries、BEA 的MessageQ 、Apache的ActiveMQ等。

消息中间件一般有两种传递模型:点对点模型(PTP)和发布-订阅模型(Pub/Sub)。
1. 点对点模型(P2P)
点对点模型用于消息生产者和消息消费者之间点到点的通信。消息生产者将消息发动到由某个名字标识的特定消费者。这个名字实际上对应于消息服务中的一个队列(Queue),在消息传动给消费者之前它被存储在这个队列中。队列可以是持久的,以保证在消息服务出现故障时仍然能够传递消息。
2 发布-订阅模型(Pub/Sub)【基于组播的通信方式】
发布-订阅模型用称为主题(topic)的内容分层结构代替了PTP 模型中的惟一目的地,发送应用程序发布自己的消息,指出消息描述的是有关分层结构中的一个主题的信息。希望接收这些消息的应用程序订阅了这个主题。订阅包含子主题的分层结构中的主题的订阅者可以接收该主题和其子主题发表的所有消息。

组播通信:
【广播】一个进程将消息发往系统中的所有进程【组播】一个进程同时将消息发往一个进程组中的每个成员

组播通信优点:发送方只需要一次消息的组播发送,而不是要求发送方多次反复发地执行消息发送操作。进程组中的进程可以固定,也可以动态组织,进程组可动态加入一个新的进程,或者删除一个进程组成员。

组播适用场景:组播是分布式系统进程协同工作的一种需求

1.基于容错目的,分布式系统的一组服务器提供相同的一个服务,客户方请求服务时,系统将该服务请求组播给这些服务器组的每个成员,并执行相同的服务操作。【即使服务器组有一个或多个服务器失效,客户方请求仍能产生满意的结果】

2.基于数据存储的安全性考虑,数据备份是最经常使用的方法,即相同的一组数据同时存储在若干个不同的服务器上。为保证数据备份的数据一致性,当一个服务器上存储的数据发生改变时,就要将这种改变的信息组播到其它各个服务器,对数据进行及时更新。

3.在提供事件机制的分布式系统中,当事件发生时,就要将事件通知组播给与该事件相关的所有进程,激发并执行相应的动作。

IP组播是一种最简单的组播实现方式,只能通过UDP得到。与基于IP的P2P数据通信一样,不能保证组播消息能全部准确无误地到达组中每个进程。

发布/订阅系统(Pub/Sub)基于事件的协同机制。用户在使用事件前,必须分别注册进程为事件的提供者或者使用者,进程以这两种角色参与事件通信。提供者和使用者之间通过事件服务器传递事件。事件的提供者将事件发送给事件服务器,事件的使用者在使用事件之前必须在事件服务器注册其订阅条件,表示对系统中的某些事件感兴趣,而事件服务器则保证将所发布的事件及时组播给所有对之感兴趣的事件使用者。在发布/订阅系统中,事件的提供者称为发布者(Publisher),事件的使用者称为订阅者(Subscriber),发布者和订阅者统称为客户,事件服务器称为事件代理(Event Broker EB),负责事件在各客户之间的连接和发送。所有客户连接到事件代理上,既可作为事件的发布者,也可作为事件的订阅者。

发布/订阅系统(Pub/Sub)支持推和拉两种协同工作模式。推模式由事件发布者产生事件,主动推送事件到事件代理,然后由事件代理推送事件到事件订阅者。

拉模式由事件订阅者主动请求发布者产生事件,事件代理等待订阅者的事件请求到来,然后再请求事件发布者产生事件并发布到事件代理。

【两种模式区别:推模式中的事件订阅者是被动地等待事件到来,而拉模式中的订阅者则是主动地请求事件。】

参考自【网络分布计算与软件工程第二版冯玉琳等著】

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

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

相关文章

一个简单的游戏服务器框架 .

最近一段时间不是很忙,就写了一个自己的游戏服务器框架雏形,很多地方还不够完善,但是基本上也算是能够跑起来了。我先从上层结构说起,一直到实现细节吧,想起什么就写什么。 第一部分 服务器逻辑 服务器这边简单的分为三…

leetcode97 交错字符串

给定三个字符串 s1, s2, s3, 验证 s3 是否是由 s1 和 s2 交错组成的。 示例 1: 输入: s1 "aabcc", s2 "dbbca", s3 "aadbbcbcac" 输出: true 示例 2: 输入: s1 "aabcc", s2 "dbbca", s3 "aadbbbaccc" 输…

leetcode 33 搜索旋转排序数组 到处是细节的好题

这个题想了想就会做,只是细节真的能卡死人,找了好久的bug。甚至我怀疑我现在的代码可能还有错,只是没例子测出来。 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1…

MachineLearning(8)-PCA,LDA基础+sklearn 简单实践

PCA,LDA基础sklearn 简单实践1.PCAsklearn.decomposition.PCA1.PCA理论基础2.sklearn.decomposition.PCA简单实践2.LDAsklearn.discriminant_analysis.LinearDiscriminantAnalysis2.1 LDA理论基础2.2 sklearn LDA简单实践1.PCAsklearn.decomposition.PCA 1.PCA理论基础 PCA:&…

leetcode198 打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的…

linux下的RPC

一、概述 在传统的编程概念中,过程是由程序员在本地编译完成,并只能局限在本地运行的一段代码,也即其主程序和过程之间的运行关系是本地调用关系。因此这种结构在网络日益发展的今天已无法适应实际需求。总而言之,传统过程调用模式…

算法(28)--矩阵搜索系列

矩阵搜索1.leetcode-200. 岛屿数量2.leetcode-695. 岛屿的最大面积3.leetcode-463. 岛屿的周长4.剑指 Offer 12. 矩阵中的路径5.leetcode-329. 矩阵中的最长递增路径6.leetcode-1091. 二进制矩阵中的最短路径1.leetcode-200. 岛屿数量 给你一个由 ‘1’(陆地&#…

leetcode213 打家劫舍II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚…

PaperNotes(4)-高质量图像生成-CGAN-StackGAN-Lapgan-Cyclegan-Pix2pixgan

cgan,stackgan,lapgan,cyclegan,pix2pixgan1.Conditional GAN1.1简介1.2网络结构与训练1.3特点与用途2.Stack GAN2.1简介2.2网络结构与训练2.3特点与用途3.Lap GAN3.1简介3.2网络结构与训练3.3特点与用途4.Pix2pix GAN4.1 简介4.2 网络结构和训练4.3 特点和用途5.Patch GAN6.Cy…

leetcode206 反转链表

反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 经典题不解释 /*** Definition for singly-linked list.* public class ListNode…

leetcode 152 乘积最大子序列

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子…

PaperNotes(5)-Conditional Generative Adversarial Nets

Conditional GAN 论文阅读笔记Abstract1 Introduction2 Related Work3 Conditional Adversarial Nets3.1 Generative Adversarial Nets3.2 Conditional Adversarial Nets4 Experimental Results4.1 Unimodal4.2 Multimodal5 Future Work6.思考文章地址:https://arxi…

蛙泳姿势教学

偶尔看到分享的一篇日志,记录下,忙过这段时间努力学蛙泳。 蛙泳配合有一个顺口溜,在讲解蛙泳动作要领之前先介绍给大家:“划手腿不动,收手再收腿,先伸胳膊后蹬腿,并拢伸直漂一会儿。”从顺口溜中…

leetcode238 除本身以外数组的乘积

给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。 示例: 输入: [1,2,3,4] 输出: [24,12,8,6] 说明: 请不要使用除法,且在 O(n) 时间复杂度内完…

C++(2)--mac使用VScode 进行C++编译、运行、调试

mac 使用VScode 进行C开发1.编译的基础概念2. mac 编译c代码2.1 查看编译器情况2.2 安装插件C/C,C/C Clang Command Adapte2.3新建一个C project2.3.1本地新建文件夹2.3.2新建mian.cpp文件2.3.3 编写hello word demo2.4 代码编译,运行,调试2.…

leetcode136 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: …

leetcode94 二叉树的中序遍历

给定一个二叉树,返回它的中序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 递归 /*** Definition for a binary tree node.* public class TreeNode …

leetcode647 回文子串

给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。 示例 1: 输入: "abc" 输出: 3 解释: 三个回文子串: "a", "…

windows下关于Objective-C开发环境的配置

最近IOS一直很火,也想学习以以下OC开发,一般装个虚拟机,然后装个mac,我相信大多数人的机子跑不起来或者很卡,所以之前借鉴了一个文章,就是关于在windows下配置OC开发环境,这里我把自己的安装说一…

PaperNotes(6)-GAN/DCGAN/WGAN/WGAN-GP/WGAN-SN-网络结构/实验效果

GAN模型网络结构实验效果演化1.GAN1.1网络结构1.2实验结果2.DCGAN2.1网络结构2.2实验结果3.WGAN3.1网络结构3.2实验结果4.WGAN-GP4.1网络结构4.2实验结果5.WGAN-SN5.1网络结构5.2实验结果小结1.GAN 文章: https://arxiv.org/pdf/1406.2661.pdf 代码: Py…