2013-04-22 85 views
3

我目前有一個pub/sub系統正在運行,它允許客戶端連接到一箇中央消息路由守護進程,訂閱一系列消息,然後開始喋喋不休。路由守護進程跟蹤和維護每個用戶感興趣的消息(基於一個簡單的標籤),並在每個訂戶生成它們時傳遞相應的感興趣消息。基本上,每個連接都被認爲是潛在的發佈者訂戶並且通常是,守護進程根據需要處理路由和傳送。ZeroMQ分佈模式

例如,三個客戶端的所有連接,並訂閱感興趣的消息標記(S)(MT):

Client 1(C1) subscribes to MT => 123 
Client 2(C2) subscribes to MT => 123 & 456 
Client 3(C3) subscribes to MT => 123 & 456 & 789 

C1 produces MT 456: daemon delivers a copy to C2 and C3 
C2 produces MT 123: daemon delivers a copy to C1 and C3 (not self) 
C3 produces MT 999: daemon delivers it to none (nobody subscribed) 

ZeroMQ與同事進行討論,並用它修補了幾個後,想出了我不認爲我看到了實施/替換我們目前擁有的系統的適當模式。此外,我想使用EPGM來利用多播增益,並消除當前擁有的基於TCP的守護進程,即中間的猴子。

有什麼建議嗎?

回答

2

可以使用ZeroMQ來設計這樣的系統。基本上說,你可以創建一個守護進程綁定兩個套接字:PULL從客戶端接收消息和PUB發佈消息。每個客戶端 SUB插座和PUSH插座連接到服務器。 EPGM可能用於PUB/SUB套接字,但PUSH/PULL套接字仍然是TCP。

該設計的缺點是主題過濾和刪除自己的消息必須手動完成。例如,您可以創建三個部分消息:

  1. 主題製作的
  2. ID
  3. 消息體

客戶應閱讀立即丟棄消息的尾部的消息部分是不感興趣使用PUB/SUB消息信封在本指南的本節中詳細介紹:http://zguide.zeromq.org/page:all#Pub-Sub-Message-Envelopes。客戶端過濾不應該影響性能,因爲所有的PGM數據包都必須傳送到所有連接的接收器。

這種設計非常簡單但相當有效。它不包括可靠性,高可用性,故障恢復和其他重要方面 - 所有這些都可以在ZeroMQ中使用,並且在指南中涵蓋。可能ZeroMQ的最大特點是可以從簡單的東西入手,並且可以根據需要添加功能,而不會造成痛苦和/或重大改寫。

非常類似的東西(加狀態的快照,可靠性等等)指導的一章「可靠的發佈 - 訂閱(克隆模式)」中描述:http://zguide.zeromq.org/page:all#toc119

順便說一句,這也是可以設計的P2P系統中央守護進程只用作名稱服務器,但它肯定會更復雜。

+0

謝謝,這是好東西。我試圖採用epgm方法,並不確定我是否對zmq做了些愚蠢的事情,或者如果我在使用的服務器上存在MCAST環回問題。我確信我被困在了15年的車轍中(這是我編寫pub/sub守護進程的時候),我錯過了一些明顯的東西。仍然不確定發生了什麼問題,默認的TTL爲1應該允許在同一個系統上使用通信,但我會繼續插入。 – jbphelps 2013-04-24 00:39:55