2015-09-11 27 views
1

在我們的分佈式系統中有本地和.NET組件,有一個代理既充當網絡拓撲資源管理器又充當消息路由器。 運輸和序列化由內部開發的組件提供 - 這是醜陋的和錯誤的。如何通過ZeroMQ實現單向RPC調用

我正在尋找提供RPC或消息傳遞以及序列化的解決方案。

我不需要AMQP代理,因爲它需要額外的管理交換和隊列。

另外我不需要系統中消息的持久性 - 每個這樣的消息都只有實時的價值。

我知道Thrift提供RPC也序列化 - 它爲我的作品只是部分,因爲在我們的系統中的一些通信是基於PUB/SUB模式,Thrift不適合這個。

哪個ZeroMQ消息傳遞模式適用於單向(異步)調用?

我們系統中的某些組件執行單向請求(這不是數據分發,因此我認爲這裏的套接字不適合在這裏使用)。

ZeroMQREQ/REP插座是不是太選項。也許有其他一些模式?

+0

您已經消除了節儉,因爲它不支持PUB/SUB,並且您不想同時使用這兩者。所以基本上,剩下的唯一問題就是這樣一個問題:**我應該選擇哪種模式來通過ZMQ進行簡單的RPC調用?**可以通過這種方式正確地進行總結嗎?那麼你應該相應地修改問題。 – JensG

+1

您可以使用經銷商給經銷商或推拉。但是,如果你有兩種方式和一種方式,我建議使用經銷商路由器。只要消息是單向的,就不要回復。 – somdoron

回答

0

我想描述我的解決方案,它工作正常。正如@somdoron所言,我使用DEALER-ROUTER組合來發送請求(同步和單向)。

架構是如下因素:

  • 前端經銷商插座發出請求和訂戶插座接收事件。前端只知道經紀人。
  • 經紀人有3個套接字:ROUTER - 接收請求(並在需要時發回迴應); PUBLISHER - 分配對負責處理的後端服務的請求,並分發事件; PULL - 從後端接收處理結果。
  • 後臺服務(每個服務具有不同的功能,也可以通過經紀人相互溝通)有3個套接字來對應代理的套接字。 SUBSCRIBER - 接收來自經紀人的命令(請求)。 經銷商 - 向其他後端服務發送請求(或通知)。PUSH - 將處理結果傳送給經紀人。

它是如何工作的,詳情。從前端M{frame[0]=command, frame[1]=body}

  • 路由器收到的消息:FM{frame[0]=Identity, frame[1]=command, frame[2]=body}
  • 變換消息FM,以發佈到後端:

    1. 前端的經銷商發送多部分消息券商PM{frame[0]=command, frame[1]=Identity, frame[2]=body},然後PUBLISHER將發佈這一修改的消息對後端
    2. 後端的用戶收到這樣的消息(PM-見上文),後端執行處理
    3. 當處理消息時,如果需要響應,後端會將其創建爲響應消息RM{frame[0]=Identity, frame[1]=result}並使用PUSH套接字將結果發送給經紀人
    4. 經紀人的PULL套接字將收到結果並將其傳遞給ROUTER,因此結果消息RM{frame[0]=Identity, frame[1]=result}將被傳遞到由Identity標識的前端。
  • +0

    我使用單獨的PUSH-PULL將後端結果傳輸到代理,因爲我不想在ROUTER上創建複雜的邏輯。 如果後端服務A爲了處理請求,需要向另一個服務B發出額外的請求,它會在前端使用的同一個方案上進行。 –