(本實(shí)例都是使用的Net的客戶端,使用C#編寫(xiě))

  在第二個(gè)教程中,我們學(xué)習(xí)了如何使用工作隊(duì)列在多個(gè)工作實(shí)例之間分配耗時(shí)的任務(wù)。

  但是,如果我們需要在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行功能并等待結(jié)果怎么辦? 那是一個(gè)不同的故事。 此模式通常稱(chēng)為遠(yuǎn)程過(guò)程調(diào)用或RPC。

  在本教程中,我們將使用RabbitMQ構(gòu)建一個(gè)RPC系統(tǒng):一個(gè)客戶機(jī)和一個(gè)可擴(kuò)展的RPC服務(wù)器。 由于我們沒(méi)有任何值得分發(fā)的耗時(shí)任務(wù),我們將創(chuàng)建一個(gè)返回斐波納契數(shù)字的虛擬RPC服務(wù)。

1、客戶端接口【Client Interface】

  為了說(shuō)明如何使用RPC服務(wù),我們將創(chuàng)建一個(gè)簡(jiǎn)單的客戶端類(lèi)。 它將公開(kāi)一個(gè)名為call的方法,該方法發(fā)送RPC請(qǐng)求并阻塞,直到接收到答案:

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)

var rpcClient = new RPCClient();

Console.WriteLine(" [x] Requesting fib(30)");var response = rpcClient.Call("30");
Console.WriteLine(" [.] Got '{0}'", response);

rpcClient.Close();

photoshop培訓(xùn),電腦培訓(xùn),電腦維修培訓(xùn),移動(dòng)軟件開(kāi)發(fā)培訓(xùn),網(wǎng)站設(shè)計(jì)培訓(xùn),網(wǎng)站建設(shè)培訓(xùn)


   關(guān)于RPC的注釋

   雖然RPC是一個(gè)很常見(jiàn)的計(jì)算模式,但它經(jīng)常被批評(píng)。 當(dāng)系統(tǒng)出現(xiàn)問(wèn)題的時(shí)候,程序員不知道函數(shù)調(diào)用是本地函數(shù)還是緩慢的RPC調(diào)用,這樣的混亂導(dǎo)致了系統(tǒng)的不可預(yù)測(cè)性,并增加了調(diào)試的復(fù)雜性。 濫用RPC可能導(dǎo)致代碼的可維護(hù)性很差,這樣的設(shè)計(jì)不但沒(méi)有簡(jiǎn)化軟件,而且只會(huì)是系統(tǒng)更糟。

   銘記這一點(diǎn),請(qǐng)考慮以下建議:

     確保顯而易見(jiàn)哪個(gè)函數(shù)調(diào)用是本地的,哪個(gè)是遠(yuǎn)程的。
     記錄您的系統(tǒng)。 使組件之間的依賴關(guān)系清除。
     處理錯(cuò)誤情況。 當(dāng)RPC服務(wù)器停機(jī)很長(zhǎng)時(shí)間后,客戶端應(yīng)該如何反應(yīng)?

    當(dāng)有疑問(wèn)避免RPC。 如果可以的話,您應(yīng)該使用異步管道 - 而不是類(lèi)似RPC的阻塞,將異步推送到下一個(gè)計(jì)算階段。

2、回調(diào)隊(duì)列【Callback queue】
  
   一般來(lái)說(shuō)RPC對(duì)RabbitMQ來(lái)說(shuō)很容易。 客戶端發(fā)送

網(wǎng)友評(píng)論