2013-02-05 54 views
7

我剛開始理解並嘗試使用ZeroMQ。ZeroMQ - 多個發佈者和監聽者

我不清楚我如何在兩個以上的角色(發佈者和訂閱者)之間進行雙向通信,以便每個組件都能夠在MQ上讀寫。

這將允許創建事件驅動的體系結構,因爲每個組件都可以監聽事件並回復其他事件。

有沒有辦法直接與ZeroMQ做到這一點,或者我應該實現自己的解決方案?

回答

9

如果你想要簡單的雙向通信,那麼你只需在每個節點上設置一個發佈套接字,然後讓每個節點都連接到另一個節點。

在多對多的設置中,這很快就會變得棘手。基本上,這聽起來像是你想要某種中心節點,所有節點都可以「連接」,接收來自消息的中心節點,並且如果滿足用戶的某些條件,則發送消息。由於ZeroMq是一個簡單的「電源插座」,而不是一個消息隊列(因此​​它的名稱,ZeroMQ - 零消息隊列),這是而不是可以立即使用。

一個簡單的選擇可能是讓每個節點設置一個UDP廣播套接字(不使用ZeroMq,只是常規套接字)。所有節點都可以偵聽發生的任何事情,並將其自己的消息「發佈」回套接字上,從而有效地將其發送到任何正在偵聽的節點。這種設置可以在局域網上運行,也可以在消息丟失的情況下使用(比如週期性狀態更新)。如果消息需要可靠(並且可能持久),則需要更先進的全面消息隊列。

如果您沒有持久的消息隊列,您可以創建一個基於中央節點的解決方案,這是一箇中央消息處理程序,所有節點都可以訂閱並向其發送數據。基本上,使用一個REP(Response)套接字(用於傳入數據)和一個PUB(Publisher)套接字(用於傳出數據)創建一個「服務器」。然後,每個客戶端通過REQ(請求)套接字將數據發佈到服務器REP套接字,並將SUB(訂戶)套接字設置爲服務器PUB套接字。

查看關於可用的各種message patterns的ZeroMq指南。通過將輸出消息(在服務器PUB套接字上)拆分爲兩個消息部分(參見multi-part messages),可以添加事件「主題」,包括服務器端過濾,其中第一部分指定「主題」和第二部分包含有效載荷(例如,temp | 46.2,speed | 134)。這樣,每個客戶端可以註冊其對任何主題(或全部)的興趣,並讓服務器僅過濾出匹配的消息。有關詳細信息,請參閱this example

基本上,ZeroMq是「只是」對普通套接字的抽象,提供了幾種消息傳遞模式來構建您的解決方案。但是,它可以減輕您繁瑣的工作,並提供可伸縮性和卓越性能。但需要一些習慣。查看ZeroMq Guide瞭解更多詳情。

+0

通過閱讀一些資源,在我看來,按照我的意思,這樣做的最好方法就是在每個節點上創建一個發佈套接字,如您所說。這是否意味着我需要明確地向所有這些套接字發送消息?我正在考慮像雲一樣的MQ,每個組件都可以在其上進行監聽和寫入,從而允許我添加 - 刪除組件,而無需相互修改。不知道我是否清楚自己想做什麼。 – user1978591

+0

是的,所有訂閱者都需要訂閱所有其他發佈套接字的節點,這就是爲什麼我不認爲這是可行的解決方案。正如我在我的回答中提到的,另一種方法是基於ZeroMq套接字創建自己的MQ服務或消息服務器。這樣節點就不必訂閱每個其他節點的套接字,只需要這個服務器的發佈套接字。使用ZeroMq創建這個應該不會太難。另一種方法是設置一些現成的東西,比如RabbitMQ。 –

+0

是的,我想我會嘗試建立它。非常感謝,你很親切。 – user1978591