我會在這裏回答我自己的問題,以防其他人使用它。
的要求,其中:
的客戶端應該能夠向服務器什麼IDS(主題)可供訂閱。
客戶端應該選擇它感興趣的ID並告訴服務器。
服務器應該爲所有訂閱過的id創建數據並將該數據發送給客戶端。
如果任何一個人離開,客戶端和服務器不應該阻塞/掛起。
實現:
第1步是雙向的流量,並與REQ/REP套接字來完成。
第2步。是單向流量從一個客戶端到一個服務器,並通過PUSH/PULL套接字完成。
第3步。是從一個服務器到多個客戶端的單向流量,由PUB/SUB套接字完成。
第4步。如果另一個不在那裏,接收方可以阻止服務器或客戶端。因此,在我嘗試和接受之前,我遵循了「懶惰的海盜模式」來檢查隊列中是否有任何東西要接收。 (如果隊列中沒有任何內容,我會再次檢查程序的下一個循環等)。
第4步。客戶可能死亡而無需取消訂閱,並且服務器不知情,它將繼續發佈這些ID的數據。解決方案是讓客戶端每隔一段時間重新發送訂閱信息(帶有時間戳)到服務器。這可以作爲客戶訂閱的ID的心跳。如果客戶端在未取消訂閱的情況下死亡,服務器會注意到某些訂閱ID在一段時間內未被刷新(時間戳)。服務器刪除這些ID。
此解決方案似乎工作正常。儘管如此,這還是很多低級別的工作。如果zeromq更高一點,並且有一些通用可靠的架構/框架可以立即使用,那將會很好。
你必須製作一個'XSUB/XPUB'代理/設備,它也在監聽這些消息。你會得到以'0x00'或'0x01'開頭的消息,這樣說的消息會告訴你要訂閱什麼和取消訂閱。你使用哪種編程語言?另請參閱[Espresso示例](https://github.com/imatix/zguide/blob/master/examples/C%23/espresso.cs)。 – metadings
謝謝。我正在使用C++。第二個想法是,我想我將使用第二個REQ/REP頻道來提供有關訂閱和心跳的元數據。這樣,如果客戶端在未取消訂閱的情況下死亡,服務器將知道它。 –
是的,另一個「控制飛機」是一種方法。另外可以觀察到,初始的PUB/SUB在SUB端進行過濾,這會在您的用例中產生很多流量。 – user3666197