官术网_书友最值得收藏!

2.1.2 通信的成本

之所以花費那么多篇幅來介紹IPC的手段,是因為最初計算機科學家們的想法,就是將RPC作為IPC的一種特例來看待,這個觀點在今天,僅從分類上說也仍然合理,只是到具體操作手段上就不合適了。

請特別注意最后一種基于套接字接口的通信方式(IPC Socket),它不僅適用于本地相同機器的不同進程間通信,由于Socket是網絡棧的統一接口,它也能支持基于網絡的跨機進程間通信。譬如Linux系統的圖形化界面、X Window服務器和GUI程序之間的交互就是由這套機制來實現的。這樣做的好處是,由于Socket是各個操作系統都提供的標準接口,完全有可能把遠程方法調用的通信細節隱藏在操作系統底層,從應用層面上來看可以做到遠程調用與本地的進程間通信在編碼上完全一致。事實上,在原始分布式時代的早期確實是奔著這個目標去做的,但這種透明的調用形式反而給程序員帶來通信無成本的假象,因而被濫用,以致于顯著降低了分布式系統的性能。1987年,在“透明的RPC調用”一度成為主流范式的時候,Andrew Tanenbaum教授曾發表論文“A Critique of The Remote Procedure Call Paradigm”[1],對這種透明的RPC范式提出一系列質問。

·兩個進程通信,誰作為服務端,誰作為客戶端?

·怎樣進行異常處理?異常該如何讓調用者獲知?

·服務端出現多線程競爭之后怎么辦?

·如何提高網絡利用的效率?連接是否可被多個請求復用以減少開銷?是否支持多播?

·參數、返回值如何表示?應該有怎樣的字節序?

·如何保證網絡的可靠性?調用期間某個鏈接忽然斷開了怎么辦?

·發送的請求服務端收不到回復怎么辦?

論文的中心觀點是:把本地調用與遠程調用當作同樣的調用來處理,這是犯了方向性的錯誤,把系統間的調用透明化,反而會增加程序員工作的復雜度。此后幾年,關于RPC應該如何發展、如何實現的論文層出不窮,透明通信的支持者有之,反對者有之,冷靜分析者有之,狂熱唾罵者也有之,但歷史逐漸證明Andrew Tanenbaum的預言是正確的。最終,到1994年至1997年間,由ACM和Sun院士Peter Deutsch、套接字接口發明者Bill Joy、Java之父James Gosling等一眾在Sun公司工作的專家們共同總結了通過網絡進行分布式運算的八宗罪(8 Fallacies of Distributed Computing)[2]。

1)The network is reliable.——網絡是可靠的。

2)Latency is zero.——延遲是不存在的。

3)Bandwidth is infinite.——帶寬是無限的。

4)The network is secure.——網絡是安全的。

5)Topology doesn’t change.——拓撲結構是一成不變的。

6)There is one administrator.——總會有一個管理員。

7)Transport cost is zero.——不必考慮傳輸成本。

8)The network is homogeneous.——網絡都是同質化的。

以上這八條反話被認為是程序員在網絡編程中經常忽略的八大問題,潛臺詞就是如果遠程服務調用要透明化,就必須為這些罪過埋單,這算是給RPC能否等同于IPC來暫時定下了一個具有公信力的結論。至此,“RPC應該是一種高層次的或者說語言層次的特征,而不是像IPC那樣,是低層次的或者說系統層次的特征”的觀點成為工業界、學術界的主流觀點。

在20世紀80年代初期,傳奇的施樂Palo Alto研究中心發布了基于Cedar語言的RPC框架——Lupine,并實現了世界上第一個基于RPC的商業應用——Courier,這里施樂Palo Alto研究中心所定義的“遠程服務調用”的概念就是完全符合以上對RPC的結論的,所以,盡管此前已經有用其他名詞指代“調用遠程服務”的操作,一般仍認為RPC的概念最早是由施樂公司提出的。

額外知識

首次提出遠程服務調用的定義

遠程服務調用是指位于互不重合的內存地址空間中的兩個程序,在語言層面上,以同步的方式使用帶寬有限的信道來傳輸程序控制信息。

——Bruce Jay Nelson,Remote Procedure Call,Xerox PARC,1981

[1] 下載地址:https://www.cs.vu.nl/~ast/Publications/Papers/euteco-1988.pdf。

[2] 詳見:https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing。

主站蜘蛛池模板: 云南省| 东乌珠穆沁旗| 隆昌县| 抚宁县| 陆川县| 桑日县| 德保县| 兴和县| 深泽县| 马公市| 方山县| 正安县| 永新县| 兴城市| 鄂托克前旗| 宜春市| 乌鲁木齐市| 四川省| 大余县| 南充市| 宝坻区| 垫江县| 繁峙县| 萍乡市| 保山市| 望谟县| 洱源县| 玛纳斯县| 米林县| 元氏县| 磴口县| 北票市| 集安市| 佳木斯市| 台前县| 东源县| 龙川县| 黑河市| 永宁县| 清涧县| 法库县|