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.pswp.cn/news/444956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444956.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

網關服務器 .

之前想著要把什么什么給寫一下,每次都太懶了,都是想起了才來寫一下。今天只討論游戲服務器的網關服務器。 1.轉發 轉發客戶端和服務器間的消息,網關將場景、會話、數據、名字、平臺等服務器的數據轉發給客戶端,接收客戶端的數據&a…

算法(26)-最長系列

最長系列1.LeetCode-32 最長有效括號--子串2.LeetCode-300 最長上升子序列--長度3.LeetCode-32 最長回文子串--是什么5.LeetCode-512 最長回文子序列--長度6.LeetCode-1143 最長公共子序列--長度6.LeetCode-128 最長連續序列--長度7.LeetCode-14 最長公共前綴-字符串8.劍指offe…

一個簡單的游戲服務器框架 .

最近一段時間不是很忙,就寫了一個自己的游戲服務器框架雛形,很多地方還不夠完善,但是基本上也算是能夠跑起來了。我先從上層結構說起,一直到實現細節吧,想起什么就寫什么。 第一部分 服務器邏輯 服務器這邊簡單的分為三…

游戲登陸流程 .

當公司有很多游戲的時候,那么公司往往會有一個統一的賬號管理平臺,就就像盛大通行證、網易通行證,戰網平臺,這些平臺統一管理游戲的賬號數據。 打個比方,現在我們玩星辰變,那么玩家登陸游戲的時候…

leetcode97 交錯字符串

給定三個字符串 s1, s2, s3, 驗證 s3 是否是由 s1 和 s2 交錯組成的。 示例 1: 輸入: s1 "aabcc", s2 "dbbca", s3 "aadbbcbcac" 輸出: true 示例 2: 輸入: s1 "aabcc", s2 "dbbca", s3 "aadbbbaccc" 輸…

算法(27)-最大系列

最大系列1.LeetCode-239 滑動窗口的最大值2.LeetCode-53 連續子數組的最大和3.LeetCode-152 乘積最大的子數組。4.劍指 Offer 14- I. 剪繩子為k個整數段,使各個段成績最大1.dp數學推導1.LeetCode-239 滑動窗口的最大值 窗口由左往右最大值數組Left,和由…

mysql數據庫表的導入導出

MySQL寫入數據通常用insert語句,如 復制代碼 代碼如下: insert into person values(張三,20),(李四,21),(王五,70)…; 但有時為了更快速地插入大批量數據或…

leetcode 33 搜索旋轉排序數組 到處是細節的好題

這個題想了想就會做,只是細節真的能卡死人,找了好久的bug。甚至我懷疑我現在的代碼可能還有錯,只是沒例子測出來。 假設按照升序排序的數組在預先未知的某個點上進行了旋轉。 ( 例如,數組 [0,1,2,4,5,6,7] 可能變為 [4,5,6,7,0,1…

多線程中局部靜態變量初始化的陷阱

C當中常常需要一個全局唯一的對象實例,這時候,我們就會想到單件模式。如何實現這一模式?全局變量當然是一個簡單可行的方法,然而,這太丑陋。嗯,其實,丑陋倒也罷了,最嚴重的是它將引誘…

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:&…

引用變量和引用數組

前兩天沒事干,重拾C++的一些書籍,翻到引用這,無意寫了些DD: 其實引用和指針有很多相似的地方,又有不同的(太多了,不過說到效率上,比如函數傳參數,我們可以用引用,指針,哪種好呢,引用不必為站再分配空間了,而指針還學要分配4字節的空間給指針變量) 我們知道如何…

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

你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味著第一個房屋和最后一個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚…

linux下安裝boost

以下是在ubuntu 7.10 (內核 2.6.22-14)下安裝的例子: 一、下載最新的 boost 庫,下載地址: http://www.boost.org/users/download/ 二、在適當的位置解壓 boost 庫,推薦把 boost 庫解壓到 /usr/local/ 下: $ cd dowlo…

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…

關于c++的一些案例

之前做項目的時候,有時候會用到位,也就是將一些數據放在二進制里,然后存在數據庫中或者緩存在服務器上,取出來,然后要判斷某位是不是置0或1,然后再將某位置0或1(比如領多個獎勵的 游戲邏輯),之前有點傻,竟然用 << ,>>這些運算符計算,今天翻起以前好久不…

C++(1)--概況、開發工具、hello word

簡介1. 概況2. 開發工具3. mac 寫hello word4. c 基本概念5.兩個數相加代碼分解5.1編譯預處理命令# include5.2輸入輸出庫iostream6.注釋7.編碼規范《老九學堂C課程》《C primer》學習筆記。《老九學堂C課程》詳情請到B站搜索《老九零基礎學編程C入門》1. 概況 20世紀70年代&a…

class 和 struct的區別

C中的struct對C中的struct進行了擴充&#xff0c;它已經不再只是一個包含不同數據類型的數據結構了&#xff0c;它已經獲取了太多的功能。 struct能包含成員函數嗎&#xff1f; 能&#xff01; struct能繼承嗎&#xff1f; 能&#xff01;&#xff01; struct能實現多態嗎&…