2017-02-19 31 views
1

我是ZeroMQ新手(在C++上)。?br: 寫程序時用PUB/SUB正式通信模式原型,我困住了一個問題。ZeroMQ可以計算未完成消息的數量嗎?

計劃
這是我的項目,在這裏我想給儘可能多的信息發送到PUB
爲此,我曾使用一個ROUTER套接字類型。

問題
接收機是緩慢的,由於該消息被排隊得到(直至到達高水印)和在這之後,開始丟棄上SUB側。

尋找
我想從ZeroMQ(對C++)的方法,該告訴我了「傑出隊列中的消息計數」。

搜索了很多,但沒有找到任何答案。
我正在尋找任何形式的指針或幫助。

+2

ZMQ是一個Actor模型系統。這意味着發件人無法知道郵件何時發送。如果你想這樣做,你必須有一個單獨的套接字用於消息從訂戶返回給發佈者,消息的含義是「請發送另一條消息」。 – bazza

+0

@bazza 13,感謝您的回覆。在做谷歌時,我發現如果send()用DONTWAIT標誌調用,那麼它將在Queue Full(消息傳遞失敗)情況下返回-1。嘗試相同,但它不起作用。它總是返回數據的大小。你有什麼想法嗎?即使隊列已滿,但仍然發送()返回適當的值。 –

回答

0

聽起來好像您正在使用異步消息。這意味着發送者將不知道消息到達和/或排隊。你可以嘗試使用一個靜態計數器,每當發送者發送消息時你會增加一個,而另一個靜態變量在接收者收到消息時會增加。考慮到這兩者的差異應該告訴你有多少消息可能排隊。它可能會給你更多的洞察力,儘管這應該是實驗性的,因爲它不安全。你應該關注的是優化SUB,這樣它就不會丟失任何消息。檢查費率,看看你是否可以解決這個問題。或者,您可以創建自己的緩衝區,如果處理導致延遲,您將使用該緩衝區來存儲傳入的消息。

1

找到答案。在路由器類型下使用3個參數,我能夠解決它。在zmq.hpp中我們發送了 (直到router-> send方法)。 在路由器級別,我們有多個檢查如(隊列已滿或數據包未收到,等) 如果我們設置*路由器強制/ sendtimeout(-1)/和發送數據包與dontwait然後zmq發送將處理所有錯誤/重新-try(包括zmq隊列滿或HWM命中)。

相關問題