天天看點

分布式對象和遠端調用

一.引言

  分布式對象技術是在面向對象技術的基礎上發展起來的,它要解決的主要問題是位于不同程序中的對象之間的調用問題。

支援通路異地對象,支援通路異構對象(java平台調用C、vb,C++)。

  1.中間件是一種軟體,它提供基本的通信子產品和其他一些基礎服務子產品,使得應用程式開發提供平台。

  中間件技術提供了一個程式設計的抽象,來屏蔽上述的異質問題。

  通信協定:獨立于網絡底層的傳輸協定。

  硬體:資料類型在不同的硬體平台上有不同的表示。

  作業系統:在作業系統層上提供更進階的抽象API,屏蔽操作系 統的異構。

  程式設計語言:CORBA通過IDL,可以使得不同的語言寫的代碼互相 調用。

  一個子產品的接口包含了其他子產品可通路的方法 的定義(沒有實作)和變量。有些情況,需要調用同一個方法,但是的具體 實作的不同,接口可以做到這一點。分布式系統中的接口,同一個位址空間,子產品之間的通信可以通過訪 問公共變量,但是遠端調用不能直接通路變量,隻能通過屬土參數和輸出參數,指針不能作為參數傳遞或者作為結果傳回。

  RPC’s Service interface

  對伺服器一組過程的說明,定義每個過 程的輸入輸出參數,供用戶端調用。

  RMI’s Remote interface

  對一個對象的方法的說明。

  可以傳遞一個對象或者遠端對象的指針, 也可以傳回這兩種類型,這是與過程調 用最大的不同。

  接口定義語言(IDLs—Interface Definition Languages ),Java RMI中可以直接定義接口,隻能 被java語言調用

其它中間件系統提供了IDLs. e.g. CORBA IDL (n1), DCE IDL and DCOM IDL,允許用其它語言實作的對象來調用, 具有跨平台功能。

  在谷粉找,就這一個​​http://www.slideshare.net/chinainvent/totemsrprrp​​

  單點傳播、多點傳播和廣播單點傳播”(Unicast)、“多點傳播”(Multicast)和“廣播”(Broadcast)這三個術語都是用來描述網絡節點之間通訊方式的術語。那麼這些術語究竟是什麼意思?差別何在?

  1.單點傳播:網絡節點之間的通信就好像是人們之間的對話一樣。如果一個人對另外一個人說話,那麼用網絡技術的術語來描述就是“單點傳播”,此時資訊的接收和傳遞隻在兩個節點之間進行。單點傳播在網絡中得到了廣泛的應用,網絡上絕大部分的資料都是以單點傳播的形式傳輸的,隻是一般網絡使用者不知道而已。例如,你在收發電子郵件、浏覽網頁時,必須與郵件伺服器、Web伺服器建立連接配接,此時使用的就是單點傳播資料傳輸方式。但是通常使用“點對點通信”(Point to Point)代替“單點傳播”,因為“單點傳播”一般與“多點傳播”和“廣播”相對應使用。

  2.多點傳播:“多點傳播”也可以稱為“多點傳播”,在網絡技術的應用并不是很多,網上視訊會議、網上視訊點播特别适合采用多點傳播方式。因為如果采用單點傳播方式,逐個節點傳輸,有多少個目标節點,就會有多少次傳送過程,這種方式顯然效率極低,是不可取的;如果采用不區分目标、全部發送的廣播方式,雖然一次可以傳送完資料,但是顯然達不到區分特定資料接收對象的目的。采用多點傳播方式,既可以實作一次傳送所有目标節點的資料,也可以達到隻對特定對象傳送資料的目的。   IP網絡的多點傳播一般通過多點傳播IP位址來實作。多點傳播IP位址就是D類IP位址,即224.0.0.0至239.255.255.255之間的IP位址。Windows 2000中的DHCP管理器支援多點傳播IP位址的自動配置設定。

  3.廣播:“廣播”在網絡中的應用較多,如客戶機通過DHCP自動獲得IP位址的過程就是通過廣播來實作的。但是同單點傳播和多點傳播相比,廣播幾乎占用了子網内網絡的所有帶寬。拿開會打一個比方吧,在會場上隻能有一個人發言,想象一下如果所有的人同時都用麥克風發言,那會場上就會亂成一鍋粥。集線器由于其工作原理決定了不可能過濾廣播風暴,一般的交換機也沒有這一功能,不過現在有的網絡交換機(如全向的QS系列交換機)也有過濾廣播風暴功能了,路由器本身就有隔離廣播風暴的作用。   

  廣播風暴不能完全杜絕,但是隻能在同一子網内傳播,就好像喇叭的聲音隻能在同一會場内傳播一樣,是以在由幾百台甚至上千台電腦構成的大中型區域網路中,一般進行子網劃分,就像将一個大廳用牆壁隔離成許多小廳一樣,以達到隔離廣播風暴的目的。   

  在IP網絡中,廣播位址用IP位址“255.255.255.255”來表示,這個IP位址代表同一子網内所有的IP位址。

  RSS 是一種用于共享新聞和其他Web内容的資料交換 規範,起源于 網景通訊公司 的推"Push"技術,将訂 戶訂閱的内容傳送給他們的 通訊協同格式 (Protocol)。

二.分布式對象之間的通信

  對象相當于server, 調用該對象方法的程式是client.作為 server的對象需要通路其它對象的方法 時,它就是client。

程序中可以包含多個對象,本地的和遠端的。調 用其它程序的對象叫遠端調用,即使在同一台機 器上,不同的位址空間的調用也叫遠端調用.

  提供可被遠端調用方法的對象叫遠端對象。調用遠端對象必須先獲得遠端對象的引用。遠端對象通過遠端接口定義可被遠端通路的方法。

  分布對象的遠端調用不能保證每次調用都确定被執行。RRP協定通常采用一些措施來保證所要求的消息傳遞保障。

對于RRP協定,選擇不同的政策,以提供不同的送出的保證。

  Retry Request message:是否重發請求,直到收到應答或者确信伺服器已經不工作了。

  Duplicate filtering:當有重複傳輸的情況下,是否在伺服器端過濾掉重複的請求

  Retransmission of result:是否儲存結果的曆 史記錄用于重發,以便在結果丢失的情況下不需要重複執行請求

  本地調用一定會執行,且隻執行一次。exactly once

  遠端調用不能保證exactly once語義,遠端調用使用RRP協定,它有三種語義形式:

  Maybe –用戶端沒有接收到回複,用戶端能判 斷的結論是:請求可能被執行,傳回結果丢 失;也可能沒有被執行,請求消息丢失或者遠 程對象的機器不當機。如果在設計上沒有考慮重發請求,則是maybe

語義。

  存在的問題:不能保證系統正确工作。

   At-least-once – 用戶端得到一個結果,說明請求 至少被執行了一次,也可能多于一次。在它收到一個異常時,應該重發請求,直到得到結果。(Sun RPC)

  存在問題:

  任意故障:如果調用請求被重複發送,遠端 方法可能被執行一次,多次執行可能引起錯誤的結果。如果對象提供的操作是幂等操作,就不存在任意故障。

  增加消息量:當遠端伺服器不工作,會導緻 不斷重發請求,增加消息量。可以采用逾時 判斷,來結束重發。

  At-most-once – 用戶端收到一個結果,表明請求被執行了一次,并且隻執行一 次;或者收到一個異常,表明方法沒有 被執行到(JavaRMI)。

  有些應用不允許一次請求被執行多次,需要這種語義。

  措施:在伺服器端過濾重複請求,或者 在在服務儲存結果,可以保證方法不被 重複執行。

  存在問題:增加伺服器處理的負擔。

  基于TCP/IP連接配接的調用語義:當一個程序得知與對方的連接配接斷開了,以下 三種情況是可以推斷的:

  某個程序退出或關閉了連接配接

  exactly once.

  伺服器上的程序崩潰了

  at most once.

  網絡擁塞

  at least once

  根據遠端調用的容錯手段,決定了調用 語義 ????????

三.分布式程式設計的模型

  遠端過程調用(RPC--Remote Procedure Call ),不同程序之間的過程的調用,但是是相同的語言環境。

  RPC的目的是可以像程式調用一樣使用遠端 服務。RPC 使用的是客戶機/伺服器模式。

  服務程式就是一個伺服器(server),server提供一個或多個遠端過程;請求程式就是一個客戶機(client),client向server發出遠端調用。

  程式調用:如何使遠端的過程調用看起來 和本地的過程調用沒有差別的問題

網絡通信:調用程序和被調用程序間的網 絡比本地計算機有更複雜的特性。例如, 它可能限制消息尺寸,并且有丢失和重排消息的可能,安全問題;

  作業系統:運作調用和被調用程序的計算 機可能有明顯不同的體系結構和資料表示 格式;

  程式設計語言:跨語言之間的互操作問題;

  RPC引入了存根(Stub)的概念,比如服務端有某個函數fn(),它為了能夠被遠端調 用,需要通過編譯器生成兩個stub:

  用戶端的一個stub:c_fn()

  伺服器端的一個stub:s_fn()

  在用戶端,一個程序在執行過程中調用到了函數 fn(),此函數的具體實作是在遠端的某台機器上,那麼此程序實際上是調用了位于當地機器上的另外 一個版本的fn()(即c_fn()),當用戶端的消息發送到伺服器端時,伺服器端 也不是把消息直接就交給真正的fn(),而是同樣 先交給一個不同版本的fn()(即s_fn())

  Stub的主要功能是對要發送的參數進行 marshal(可了解成一種打包操作)和對接受 到的參數(或傳回值)進行unmarshal(解包)。Marshal操作将要發送的資料制成一種标 準的格式(在DCE RPC系統中,此格式 稱做Network Data Representation(NDR)格式)unmarshal再從NDR格式資料包中讀出所需資料。

  Client stub的功能:收集調用遠端函數需要的參數,将這些參數marshal成消息,即把消息轉化 成标準的網絡資料表示(network data representation , NDR) 格式,用于在網絡上傳遞,調用用戶端的運作時系統(Client runtime system)将此消息發送給伺服器端。當伺服器端将結果消息傳回後,将結果消息unmarshal,把結果傳回給應用程序。

  Server stub的功能:對發送給它的參數消息unmarshal,收集 參數調用位于本機上的過程,将此過程執行的結果marshal成消息,然 後調用伺服器端的運作時系統将結果消 息發送給用戶端。

  IDL compiler的功能就是對編輯好的IDL 檔案進行編譯,編譯後生成了下面的三個檔案:Header是一個頭檔案,此頭檔案包含 了此IDL檔案中的全局唯一标示符,數 據類型定義,有關的常量定義,以及 函數原型。客戶代碼和伺服器代碼中 包含都要包含header檔案,Client stub即用戶端的stub程式。Server stub即伺服器端的stub程式。

  運作時系統:用戶端的運作系統将用戶端stub産生的消 息可靠的傳送給server,運作時系統利用TCP/UDP等協定,将消 息發送到Server,服務端的運作時系統都偵聽某個衆所周 知的socket端口,接受請求。

  遠端方法調用(RMI--Remote Method Invocation ),一個程序調用另一個程序中對象的方法,兩個進 程可以在同一台主機,也可以在不同的主機。

  從RPC到RMI變化:從過程(靜态)->面向對象(動态),從函數調用->對執行個體的操作。

  問題:誰來建立執行個體對象?什麼時候建立?如何取得 對象的引用?

  RMI系統由以下幾個部分組成:

  運作遠端服務的伺服器

  需要遠端服務的用戶端程式

  遠端服務的接口定義(Remote Interface)

  遠端服務的實作(Remote Service)

  Stub和Skeleton檔案

  RMI命名服務,使得用戶端可以發現遠 程服務。

  事件驅動(Event-based model),注冊一些感興趣的對象的事件,事件發生時會的到通知。

  目的:讓一個對象能夠對另一個對象發生的變化做出反應

  舉例:檔案被修改了,一個電子書簽變化了位置,釋出與訂閱(Publish/subscribe paradigm),産生事件一方釋出事件的類型,接收事件一方訂閱感興趣的事件類型,事件放生時,通知訂閱一方。

  分布式事件驅動系統的兩個特性:

  異構性:已有的分布式系統的一些子產品原本不是為 了互操作而設計的,現在能夠讓他們協同工作,通 過接收方公布遠端接口。

  異步性:不能要求釋出程式和訂閱程式同步。

  這和Java的觀察者模型有聯系嗎?

  和程序間消息傳遞的語義類似,取決于應用 需求和所采用的措施。

  對可靠性要求較低的需求,一些網絡遊戲 了解其它玩家的最新狀态,普通IP多點傳播協 議。

  對可靠性要求較高的需求,股票交易所系 統。需要采用可靠的多點傳播協定。

  實時要求。 

  分布式程式設計可提供租用、分布式交易和分布式 事件。

  租用租用與租用一套較高價的電梯大廈很類似。我們在租用 一套較高價的電梯大廈時,一般會商定使用該較高價的電梯大廈的時間。 類似地,在Jini中,對象彼此之間商定租期。 例如,當某裝置使用Discovery and Join協定發 現網絡時,它就注冊一段租用時間。在租約到 期之前,該裝置必須重新商定租期。這樣,如 果租約到期或裝置拔下後,該裝置在Lookup中 的記錄就會被自動删除。這就是分布式垃圾收 集的工作原理。

五.總結

  自己實作計算引擎。