(本實(shí)例都是使用的Net的客戶端,使用C#編寫)
在第二個(gè)教程中,我們學(xué)習(xí)了如何使用工作隊(duì)列在多個(gè)工作實(shí)例之間分配耗時(shí)的任務(wù)。
但是,如果我們需要在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行功能并等待結(jié)果怎么辦? 那是一個(gè)不同的故事。 此模式通常稱為遠(yuǎn)程過程調(diào)用或RPC。
在本教程中,我們將使用RabbitMQ構(gòu)建一個(gè)RPC系統(tǒng):一個(gè)客戶機(jī)和一個(gè)可擴(kuò)展的RPC服務(wù)器。 由于我們沒有任何值得分發(fā)的耗時(shí)任務(wù),我們將創(chuàng)建一個(gè)返回斐波納契數(shù)字的虛擬RPC服務(wù)。
1、客戶端接口【Client Interface】
為了說明如何使用RPC服務(wù),我們將創(chuàng)建一個(gè)簡單的客戶端類。 它將公開一個(gè)名為call的方法,該方法發(fā)送RPC請求并阻塞,直到接收到答案:
var rpcClient = new RPCClient(); Console.WriteLine(" [x] Requesting fib(30)");var response = rpcClient.Call("30"); Console.WriteLine(" [.] Got '{0}'", response); rpcClient.Close();
關(guān)于RPC的注釋
雖然RPC是一個(gè)很常見的計(jì)算模式,但它經(jīng)常被批評。 當(dāng)系統(tǒng)出現(xiàn)問題的時(shí)候,程序員不知道函數(shù)調(diào)用是本地函數(shù)還是緩慢的RPC調(diào)用,這樣的混亂導(dǎo)致了系統(tǒng)的不可預(yù)測性,并增加了調(diào)試的復(fù)雜性。 濫用RPC可能導(dǎo)致代碼的可維護(hù)性很差,這樣的設(shè)計(jì)不但沒有簡化軟件,而且只會(huì)是系統(tǒng)更糟。
銘記這一點(diǎn),請考慮以下建議:
確保顯而易見哪個(gè)函數(shù)調(diào)用是本地的,哪個(gè)是遠(yuǎn)程的。
記錄您的系統(tǒng)。 使組件之間的依賴關(guān)系清除。
處理錯(cuò)誤情況。 當(dāng)RPC服務(wù)器停機(jī)很長時(shí)間后,客戶端應(yīng)該如何反應(yīng)?
當(dāng)有疑問避免RPC。 如果可以的話,您應(yīng)該使用異步管道 - 而不是類似RPC的阻塞,將異步推送到下一個(gè)計(jì)算階段。
2、回調(diào)隊(duì)列【Callback queue】
一般來說RPC對RabbitMQ來說很容易。 客戶端發(fā)送