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