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