2015-12-30 62 views
4

我有一個PUB服務器。它如何判斷哪些過濾器已訂閱,以便服務器知道要創建哪些數據?

服務器並不需要一次沒有SUB客戶有興趣來創建數據。如何找出PUB服務器中所有訂閱的過濾器?

說一組可能的過濾器是巨大的(或無限),但在任何時候用戶都剛剛訂閱了其中幾個。

例子:SUB客戶端只訂閱了氣象數據料在紐約和巴黎的幾個區號。然後,服務器不必爲世界上其他任何城市的每個其他區號創建天氣數據,只需再次將其全部丟棄。

你如何找出PUB服務器中的所有訂閱過濾器?

如果沒有簡單的方法,我該如何解決這個問題?

+0

你必須製作一個'XSUB/XPUB'代理/設備,它也在監聽這些消息。你會得到以'0x00'或'0x01'開頭的消息,這樣說的消息會告訴你要訂閱什麼和取消訂閱。你使用哪種編程語言?另請參閱[Espresso示例](https://github.com/imatix/zguide/blob/master/examples/C%23/espresso.cs)。 – metadings

+1

謝謝。我正在使用C++。第二個想法是,我想我將使用第二個REQ/REP頻道來提供有關訂閱和心跳的元數據。這樣,如果客戶端在未取消訂閱的情況下死亡,服務器將知道它。 –

+0

是的,另一個「控制飛機」是一種方法。另外可以觀察到,初始的PUB/SUB在SUB端進行過濾,這會在您的用例中產生很多流量。 – user3666197

回答

0

我會在這裏回答我自己的問題,以防其他人使用它。

的要求,其中:

  1. 的客戶端應該能夠向服務器什麼IDS(主題)可供訂閱。

  2. 客戶端應該選擇它感興趣的ID並告訴服務器。

  3. 服務器應該爲所有訂閱過的id創建數據並將該數據發送給客戶端。

  4. 如果任何一個人離開,客戶端和服務器不應該阻塞/掛起。

實現:

第1步是雙向的流量,並與REQ/REP套接字來完成。

第2步。是單向流量從一個客戶端到一個服務器,並通過PUSH/PULL套接字完成。

第3步。是從一個服務器到多個客戶端的單向流量,由PUB/SUB套接字完成。

第4步。如果另一個不在那裏,接收方可以阻止服務器或客戶端。因此,在我嘗試和接受之前,我遵循了「懶惰的海盜模式」來檢查隊列中是否有任何東西要接收。 (如果隊列中沒有任何內容,我會再次檢查程序的下一個循環等)。

第4步。客戶可能死亡而無需取消訂閱,並且服務器不知情,它將繼續發佈這些ID的數據。解決方案是讓客戶端每隔一段時間重新發送訂閱信息(帶有時間戳)到服務器。這可以作爲客戶訂閱的ID的心跳。如果客戶端在未取消訂閱的情況下死亡,服務器會注意到某些訂閱ID在一段時間內未被刷新(時間戳)。服務器刪除這些ID。

此解決方案似乎工作正常。儘管如此,這還是很多低級別的工作。如果zeromq更高一點,並且有一些通用可靠的架構/框架可以立即使用,那將會很好。