整合rpc远程调用_远程过程调用(RPC)
分布式系統(tǒng)的主要特點(diǎn)是能夠?qū)⒁慌_(tái)機(jī)器上的一個(gè)任務(wù)分解到系統(tǒng)中其他的機(jī)器上運(yùn)行,實(shí)現(xiàn)多個(gè)CPU的協(xié)同工作。遠(yuǎn)程過(guò)程調(diào)用RPC就是實(shí)現(xiàn)這一特點(diǎn)的有效方法之一
1.什么是RPC
RPC的基本思想
(1984年,Birrell,Nelson)允許程序調(diào)用位于其他機(jī)器上的過(guò)程,當(dāng)機(jī)器A上的一個(gè)進(jìn)程調(diào)用機(jī)器B上的過(guò)程時(shí),在A上調(diào)用進(jìn)程被掛起,在B上執(zhí)行被調(diào)用過(guò)程,過(guò)程所需的參數(shù)以消息的形式從調(diào)用進(jìn)程傳送到被調(diào)用過(guò)程,被調(diào)用過(guò)程處理的結(jié)果也以消息的形式返回給調(diào)用進(jìn)程。而對(duì)程序員來(lái)說(shuō),根本沒(méi)有看出消息傳遞過(guò)程和I/O處理過(guò)程,這種方式稱為遠(yuǎn)程過(guò)程調(diào)用。remote procedure call---RPC
2.RPC的透明性(transparent)
RPC透明性
客戶-調(diào)用進(jìn)程所在的機(jī)器
服務(wù)器-被調(diào)用過(guò)程所在的機(jī)器
RPC透明性的思想使得遠(yuǎn)程過(guò)程調(diào)用盡可能象本地調(diào)用一樣,即調(diào)用進(jìn)程應(yīng)該不知道被調(diào)用過(guò)程是在另一臺(tái)計(jì)算機(jī)上執(zhí)行,反過(guò)來(lái)也是如此,被調(diào)用過(guò)程也應(yīng)該不知道是由哪臺(tái)機(jī)器上的進(jìn)程調(diào)用。
RPC透明性的實(shí)現(xiàn)
客戶代理(client stub)
將參數(shù)封裝成消息,
請(qǐng)求內(nèi)核將消息送給服務(wù)器
調(diào)用receive原語(yǔ)進(jìn)入阻塞狀態(tài)
當(dāng)消息返回到客戶時(shí),內(nèi)核找到客戶進(jìn)程,消息被復(fù)制到緩沖區(qū),并且客戶進(jìn)程解除阻塞
客戶代理檢查消息,從中取出結(jié)果,并將結(jié)果復(fù)制給它的調(diào)用進(jìn)程
服務(wù)器代理(server stub)
調(diào)用receive原語(yǔ),處于阻塞狀態(tài),并等待消息的到來(lái)當(dāng)消息到達(dá)后,代理被喚醒
將消息分解,并取出參數(shù)
以通常方式調(diào)用服務(wù)器的過(guò)程
調(diào)用結(jié)束并獲得控制后,把結(jié)果封裝成消息
調(diào)用send原語(yǔ)發(fā)送給客戶重新調(diào)用receive等待下一個(gè)消息
RPC的工作步驟
客戶進(jìn)程以通常方式調(diào)用客戶代理
客戶代理構(gòu)造一個(gè)消息,并自陷進(jìn)入內(nèi)核
客戶內(nèi)核發(fā)送消息給遠(yuǎn)程內(nèi)核(服務(wù)器)服務(wù)器
內(nèi)核把消息送給服務(wù)器代理服務(wù)器代理從消息中分解出參數(shù),度調(diào)用服務(wù)器過(guò)程
服務(wù)器過(guò)程完成其工作,并返回給代理
服務(wù)器代理封裝結(jié)果,并自陷內(nèi)核
遠(yuǎn)程內(nèi)核發(fā)送消息給客戶內(nèi)核
客戶內(nèi)核將消息傳給客戶代理
代理分解消息取出結(jié)果,返回給調(diào)用進(jìn)程。
3.參數(shù)傳遞(Parameter Passing)
客戶代理的功能之一是取出參數(shù),將它們封裝成消息,然后發(fā)送給服務(wù)器代理。表面上看,好像很簡(jiǎn)單,但實(shí)現(xiàn)起來(lái)并不是如此。下面我們將討論RPC系統(tǒng)中參數(shù)傳遞的有關(guān)問(wèn)題。
參數(shù)整理(Parameter Marshaling),將參數(shù)封裝成消息的工作,參數(shù)傳遞中存在的問(wèn)題
系統(tǒng)中不同機(jī)器的字符集可能不同
分布式系統(tǒng)中客戶機(jī)與服務(wù)器可以是不同類型的,例如
IBM工作站EBCDIC字符集IBM PC機(jī)ASCii字符集
系統(tǒng)中不同機(jī)器的數(shù)據(jù)存儲(chǔ)方式可能不同
Intel CPU整數(shù)從右到左存儲(chǔ)( little endian),SPARC CPU整數(shù)從左到右存儲(chǔ)( big endian)
浮點(diǎn)數(shù)的位數(shù)可能不同
布爾值的表示
網(wǎng)絡(luò)傳送按字節(jié)
解決方案
設(shè)置一個(gè)基本類型的標(biāo)準(zhǔn),正則表(canonical form),描述字符集類型,數(shù)據(jù)存儲(chǔ)方式及長(zhǎng)度(位數(shù))等。過(guò)程所需的參數(shù),客戶代理在進(jìn)行參數(shù)整理時(shí)按canonical form轉(zhuǎn)換為標(biāo)準(zhǔn)類型,然后封裝成消息發(fā)送。服務(wù)器代理收到消息后,也根據(jù)該標(biāo)準(zhǔn)映射到本地機(jī)器的字符集和數(shù)據(jù)類型。
4.動(dòng)態(tài)聯(lián)編
編譯程序在編譯階段并不能確切知道將要調(diào)用的函數(shù),只有在程序運(yùn)行時(shí)才能確定將要調(diào)用的函數(shù),為此要確切知道該調(diào)用的函數(shù),要求聯(lián)編工作要在程序運(yùn)行時(shí)進(jìn)行,這種在程序運(yùn)行時(shí)進(jìn)行聯(lián)編工作被稱為動(dòng)態(tài)聯(lián)編
聯(lián)編一個(gè)程序,功能:登記(register),查找(lookup),撤銷(unregister)
服務(wù)器(export),啟動(dòng)時(shí) :register/unregister
客戶:lookup
動(dòng)態(tài)性:服務(wù)器啟動(dòng)時(shí),export for register,關(guān)閉時(shí),export for unregister
服務(wù)器故障時(shí):定期輪詢(客戶代理),對(duì)無(wú)響應(yīng)的過(guò)程unregister
動(dòng)態(tài)聯(lián)編的靈活性:
均衡工作量(load balancing):支持多服務(wù)器(support multiple servers),把客戶均衡地分布于各個(gè)服務(wù)器上;
容錯(cuò)性(fault tolerance):定期輪詢服務(wù)器(poll the server perodically),對(duì)無(wú)響應(yīng)的過(guò)程unregister,到達(dá)一定程度的容錯(cuò)性
支持權(quán)限:服務(wù)器可以指定由那些用戶使用,這樣聯(lián)編對(duì)非授權(quán)的用戶拒絕接受
動(dòng)態(tài)聯(lián)編的缺點(diǎn):
花費(fèi)系統(tǒng)時(shí)間:the extra overhead of exporting and importing interfaces costs time
客戶進(jìn)程往往執(zhí)行時(shí)間短,但每次每個(gè)進(jìn)程要重新import to binder
瓶頸:use multiple binders
5.RPC表示錯(cuò)誤的語(yǔ)義(Semantics in the Presence of Failures)
RPC的設(shè)計(jì)目標(biāo)是隱藏通信過(guò)程,使得遠(yuǎn)程過(guò)程調(diào)用像本地調(diào)用一樣,但也有一些另外,如不能處理全局變量,事實(shí)上,只要客戶和服務(wù)器能正常工作,RPC就應(yīng)該可以正常工作。下面的問(wèn)題是當(dāng)客戶或服務(wù)器出錯(cuò)誤時(shí)的處理方法
RPC可能出現(xiàn)的錯(cuò)誤及處理方法:
5.1.客戶不能找到服務(wù)器(client cannot locate the server)
客戶不能找到合適的服務(wù)器,可能原因:服務(wù)器可能關(guān)閉或服務(wù)器軟件升級(jí)。這種錯(cuò)誤目前尚無(wú)好的辦法,需要指出,我們不能試圖通過(guò)返回錯(cuò)誤代碼來(lái)實(shí)現(xiàn),因?yàn)榇a可能剛好是一個(gè)正常的返回值。從客戶到服務(wù)器的消息丟失(lost request)。客戶發(fā)出的請(qǐng)求到達(dá)服務(wù)器之前丟失,服務(wù)器根本不能響應(yīng)。
解決方法:超時(shí)重傳機(jī)制
5.2.從服務(wù)器到客戶的應(yīng)答丟失(lost reply)
同一有效性(idempotent):服務(wù)器上有些操作可以安全地重復(fù)執(zhí)行多次,而對(duì)數(shù)據(jù)不影響,如果某一請(qǐng)求的操作具有這一屬性,則稱為同一有效性(idempotent)。多數(shù)請(qǐng)求都不具有同一有效性。
丟失應(yīng)答非常難以處理,簡(jiǎn)明的解決方法是依賴于超時(shí)重傳機(jī)制,發(fā)出的請(qǐng)求在一個(gè)合理的時(shí)間內(nèi)沒(méi)有應(yīng)答,就再發(fā)送一個(gè)請(qǐng)求。這種方法的問(wèn)題是,客戶內(nèi)核無(wú)法確定為什么沒(méi)有應(yīng)答,是否請(qǐng)求或應(yīng)答丟失?或許只是服務(wù)器速度慢?
解決方案
客戶內(nèi)核給每個(gè)請(qǐng)求一個(gè)序列號(hào),服務(wù)器內(nèi)核則保留每個(gè)請(qǐng)求最近接收到的序列號(hào)。這樣,服務(wù)器就可以通過(guò)這個(gè)序列號(hào)來(lái)區(qū)別一個(gè)請(qǐng)求是重發(fā)的還是原來(lái)的,對(duì)重傳的請(qǐng)求拒絕響應(yīng)。另外,也可以在消息中增加一個(gè)位來(lái)提示該請(qǐng)求消息是原來(lái)的還是重發(fā)的,對(duì)于原請(qǐng)求可以安全地進(jìn)行處理,對(duì)于重發(fā)的請(qǐng)求,則處理要十分小心(服務(wù)器保留一個(gè)副本,是一種有效的辦法)。
5.3.服務(wù)器接收了請(qǐng)求后崩潰(server crash)
重傳機(jī)制的語(yǔ)義:
至少一次語(yǔ)義(at least once semantice):客戶等等直到服務(wù)器重啟并再次執(zhí)行操作:客戶繼續(xù)重試,直到獲得一個(gè)應(yīng)答為止。可保證RPC至少執(zhí)行一次。
至多一次語(yǔ)義(at most once semantics):立即放棄報(bào)告失敗。保證RPC至多執(zhí)行一次,但可能沒(méi)有執(zhí)行。
僅有一次語(yǔ)義(exactly once semantics):這個(gè)方案不可行,思考一下,如果服務(wù)器在執(zhí)行request和記錄執(zhí)行request時(shí)崩潰會(huì)發(fā)生什么?在記錄request和執(zhí)行request這個(gè)過(guò)程時(shí),你可以使用at-most-once,如果在這個(gè)過(guò)程中服務(wù)器崩潰,然后你將記錄這個(gè)錯(cuò)誤并執(zhí)行返回,然后你不會(huì)再一次嘗試,這就是at-most-once,而at-least-once是崩潰后,如果request是重復(fù)應(yīng)答,那么你就會(huì)繼續(xù)攜帶request再次請(qǐng)求,但exactly-once是無(wú)法被論證的 http://www.freepatentsonline.com/7162512.html.
5.4.client發(fā)送請(qǐng)求后崩潰(client crash)
客戶在發(fā)送給服務(wù)器請(qǐng)求后而在應(yīng)答收到之前崩潰
孤報(bào)(orphan):a computation is active and no parent is waiting for result.Such unwanted computation is call Orphan
存在的問(wèn)題:浪費(fèi)CPU時(shí)間,Orphan可能鎖住某些文件或占用有價(jià)值的資源,當(dāng)客戶機(jī)重啟時(shí),來(lái)自O(shè)rphan的應(yīng)答造成應(yīng)答混亂.
孤報(bào)(orphan)的解決方法
1981年Nelson提出了四種的解決方法:
消滅(extermination),思想:客戶代理在發(fā)送RPC消息后,代理進(jìn)行事務(wù)登錄(log),記錄發(fā)送的請(qǐng)求,重啟時(shí),檢查事務(wù)登錄,Orphan被撤消。缺點(diǎn):磁盤空間浪費(fèi);orphan可能引起新的RPC導(dǎo)致更多的orphan,客戶重啟后,無(wú)法找到它們;網(wǎng)絡(luò)分區(qū):網(wǎng)絡(luò)被分成兩個(gè)獨(dú)立的部分,客戶所在的另一個(gè)部分中的orphan仍能活動(dòng)(不是一中可靠的方法)
"再生"(reincarnation),思想:將時(shí)間按順序分成時(shí)間段,每一段的一個(gè)序號(hào),當(dāng)客戶重啟時(shí),廣播一個(gè)消息告訴所有的主機(jī)一上新的時(shí)間段的開(kāi)始。機(jī)器收到這樣的廣播消息后, 所有的過(guò)程計(jì)算被撤消。對(duì)于已發(fā)出的應(yīng)答,由于消息中含有時(shí)間段序號(hào)而客戶可以很容易地區(qū)別它們。缺點(diǎn):那些有效的計(jì)算也被刪除
gettlereincarnation(合理再生),思想:當(dāng)機(jī)器收到新的時(shí)間段的廣播廣消息后,每臺(tái)機(jī)器檢查是否有遠(yuǎn)程計(jì)算,如果有則試著找出它們的客戶,若能找到客戶(主人),則繼續(xù)它的計(jì)算,否則將遠(yuǎn)程計(jì)算撤消。缺點(diǎn):系統(tǒng)開(kāi)銷大。
期滿(expiration),思想:每個(gè)RPC都給對(duì)方一個(gè)標(biāo)準(zhǔn)的時(shí)間量T,來(lái)作為它的工作期限,如果它在T時(shí)間內(nèi)不能完成工作,客戶必須重新請(qǐng)求,以保證每個(gè)RPC就可以在T時(shí)間內(nèi)完成。當(dāng)有客戶崩潰后,在客戶機(jī)重起之前等待一個(gè)時(shí)間量T,這樣可保證所有的Orphan已發(fā)送。缺點(diǎn):時(shí)間量T的取值比較復(fù)雜。
6.RPC實(shí)現(xiàn)
RPC協(xié)議選擇(protocol selection)是選擇面向連接的還是非連接的協(xié)議
面向連接的協(xié)議的優(yōu)點(diǎn):通信實(shí)現(xiàn)容易:內(nèi)核發(fā)送消息后,它不必關(guān)心它是否會(huì)丟失,也無(wú)須處理確認(rèn),而這些方面都由支持連接的軟件來(lái)實(shí)現(xiàn)。缺點(diǎn):性能較差(需要額外的軟件)。在單一建筑物和校園內(nèi)使用的分布式系統(tǒng)可以采用面向連接的協(xié)議。
確認(rèn)機(jī)制(Acknowledgement)
stop-and-wait protocol: 思想:逐包確認(rèn)。特點(diǎn):一個(gè)包丟失了,可獨(dú)立重傳;容易實(shí)現(xiàn)。
blast protocol:思想:一個(gè)消息的所有包都發(fā)送完成后等待一個(gè)確認(rèn),而不是一個(gè)一個(gè)確認(rèn)。特點(diǎn):報(bào)文丟失時(shí),有兩種選擇:
1.全部放棄:等待重傳整個(gè)消息的所有包,容易實(shí)現(xiàn);
2. 選擇重傳:請(qǐng)求丟失包重傳,占用網(wǎng)絡(luò)的帶寬少,對(duì)局域網(wǎng)這種方法較少使用,廣域網(wǎng)絡(luò)上普遍采用)。
臨界路徑(critical path)
分布式系統(tǒng)是否成功依賴于它的性能的好壞,而系統(tǒng)性能的好壞又依賴于它的通信速度,通信速度與系統(tǒng)的具體實(shí)現(xiàn)有關(guān),下面我們進(jìn)一步討論從客戶到服務(wù)器執(zhí)行一個(gè)RPC的過(guò)程。
臨界路徑(critical path):每個(gè)RPC的指令執(zhí)行的順序是從客戶調(diào)用客戶代理,自陷進(jìn)入內(nèi)核,消息傳送,服務(wù)器中斷,服務(wù)器代理,最后到達(dá)進(jìn)行請(qǐng)求處理并返回應(yīng)答的服務(wù)器。RPC的這一系列步驟稱為(從客戶到服務(wù)器的)臨界路徑。
客戶調(diào)用stub procedure
申請(qǐng)一個(gè)緩沖區(qū)用來(lái)整理外出的消息,有些系統(tǒng)有一定數(shù)量的緩沖區(qū),也有一些是一個(gè)緩沖區(qū)池,從中選擇一個(gè)合適的供服務(wù)器使用。
參數(shù)整理:參數(shù)整理成適合的格式,并與消息一起插入消息緩沖區(qū)中。以備傳送,自陷進(jìn)入內(nèi)核。
切換進(jìn)入內(nèi)核:內(nèi)核獲得控制,保存CPU寄存器及內(nèi)存映像,建立新的內(nèi)存映像。
拷貝消息到內(nèi)核:因?yàn)橛脩艉蛢?nèi)核是不連接的,內(nèi)核必須明確地把拷貝到內(nèi)核緩沖區(qū)。
填入目標(biāo)地址:將其拷貝到網(wǎng)絡(luò)接口,到此客戶臨界結(jié)束。
原則上,啟動(dòng)計(jì)時(shí)器不屬于計(jì)算RPC時(shí)間的部分,啟動(dòng)計(jì)時(shí)機(jī)后,系統(tǒng)有兩種方式:忙等待和重新調(diào)度。
在服務(wù)器端,當(dāng)字節(jié)到達(dá)后,被存入板上緩沖區(qū)或主存,當(dāng)消息包的所有字節(jié)都到達(dá)后,服務(wù)器將形成一個(gè)中斷。
檢查消息包的有效性,并決定將其送給一個(gè)代理,若沒(méi)有等待的代理則放棄或保存至緩沖區(qū)。
假定有一個(gè)等待的代理,那么,消息被拷貝到代理并切換到服務(wù)器代理,恢復(fù)寄存器及主存映像,代理調(diào)用receive原語(yǔ),分解參數(shù),建立服務(wù)器的調(diào)用環(huán)境,進(jìn)行請(qǐng)求處理。
臨界路徑(critical path)的開(kāi)銷:拷貝
在考慮臨界路徑的時(shí)間開(kāi)銷問(wèn)題時(shí),其中最重大的部分是拷貝
copy1:客戶代理->內(nèi)核
copy2:內(nèi)核->網(wǎng)絡(luò)接口板
copy3:網(wǎng)絡(luò)接口板->目標(biāo)機(jī)器
copy4:網(wǎng)絡(luò)接口板->內(nèi)核
copy5:內(nèi)核->服務(wù)器代理
定時(shí)管理(timer)
所有的協(xié)議都是以通過(guò)通信介質(zhì)交換消息為目的的,而事實(shí)上,所有的系統(tǒng)中,消息都有可能丟失,或許是因?yàn)樵肼暬蚴浅d。所以,多數(shù)協(xié)議都設(shè)置定時(shí)器,當(dāng)消息發(fā)送出去后,期待應(yīng)答(確認(rèn))的到來(lái),若沒(méi)有消息到來(lái)而定時(shí)器期滿(expiration),則重發(fā)。這個(gè)過(guò)程可以重復(fù)直到發(fā)送方放棄。
設(shè)置定時(shí)器:
建立一個(gè)數(shù)據(jù)結(jié)構(gòu)來(lái)指定定時(shí)器何時(shí)期滿,以及期滿時(shí)如何處理。
多個(gè)進(jìn)程的定時(shí)器組織成列表方式
當(dāng)一個(gè)確認(rèn)或應(yīng)答在超時(shí)之前到來(lái),列表中查出對(duì)應(yīng)進(jìn)程所在的項(xiàng),將它刪除,實(shí)際上,只有少數(shù)的進(jìn)程可能超時(shí),但每一個(gè)進(jìn)程都要進(jìn)入超時(shí)表后再刪除,這些大量的工作多數(shù)是多余的。另外,定時(shí)器也不需要精確的時(shí)間,但定時(shí)太短引起過(guò)多的超時(shí),定時(shí)太長(zhǎng)則對(duì)包丟失的情況又過(guò)多的等待。
實(shí)現(xiàn)方法:在PCB中增加一個(gè)字段,稱為定時(shí)器,當(dāng)發(fā)出一個(gè)RPC時(shí),將允許延遲的時(shí)間加上當(dāng)前的時(shí)鐘的值并存于PCB中定時(shí)器字段,如果不需要超時(shí)重傳的,其值規(guī)定為0,這樣,內(nèi)核定期掃描PCB鏈表,如果定時(shí)器值非0且小于當(dāng)前時(shí)間,則該進(jìn)程超時(shí)
7.RPC與消息傳遞通信的比較
RPC結(jié)構(gòu)性好,使用方便;消息傳遞通信更靈活,但結(jié)構(gòu)性差RPC只有一個(gè)返回,而消息傳遞通信可以向多個(gè)客戶返回。RPC返回的結(jié)果或參數(shù)的值最好是少量的,消息傳遞通信可適合于大批量數(shù)據(jù)的傳遞
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的整合rpc远程调用_远程过程调用(RPC)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 灾难恢复级别_防患于未然:灾难恢复全攻略
- 下一篇: 滚动条禁止_Axure 教程:不可见滚动