2012-12-15 53 views
6

由於似乎無法查詢/檢查底層的ZeroMQ隊列/緩衝區套接字以查看它們被利用的程度,是否有某種方式可以檢測何時由於滿發送/插入時發佈者套接字中的緩衝區?在ZeroMQ隊列中檢測丟棄的消息

例如,如果發佈者隊列已滿,則zmq_send操作將簡單地刪除該消息。

基本上,我想要實現的是一種檢測隊列變得越來越緊張和/或完全能夠(稍後)調整解決方案以更好地工作的情況的方法。另一種方法是爲每個消息添加一個序列號並在訂閱者中進行簡單的計算,但由於發佈者中的緩衝區已滿,我無法確定是否丟失了一條消息。

+0

有一個非常好的回答:在什麼情況下zeromq套接字丟失或無法傳遞消息? :http://stackoverflow.com/questions/9909909/under-what-c​​ircumstances-do-zeromq-sockets-drop-or-fail-to-deliver-messages 也許這是有趣的ü – eMarine

回答

6

還有就是ZeroMQ指南中這樣的例子(你應該閱讀和消化,如果你想愉快地使用0MQ):http://zguide.zeromq.org/page:all#Slow-Subscriber-Detection-Suicidal-Snail-Pattern

的機制,你回答自己,在添加序列號,消息,並允許用戶檢測差距並採取適當的行動。對於大多數pubsub場景,您可以將默認HWM(1,000)提高到更高的值;這取決於您的平均郵件大小。

+0

RIP彼得。但是這個答案是不可接受的。 ZMQ應該給我們一個檢查郵件是否被髮送的方法。 – James

1

我知道這是一箇舊帖子,但這是我最近面臨同樣問題時所做的。

我選擇使用一個DEALER/ROUTERZMQ_SNDHWM選項設置爲1。此外,我提供在每個zmq_send()超時參數。超時時間可以是10毫秒到3秒之間的任何值,具體取決於您的場景(本地或遠程發送)。

如果消息未在超時內發送或發送緩衝區已滿,zmq_send()將返回false。這使我能夠在zmq前設置一個重試隊列。我知道這不是一個完美的解決方案,但對我來說它工作得很好。然而,讓我感到困惑的是真假的含義,它由DEALER-socket zmq_send()返回。我一直無法找到這個問題的答案。無論是表明郵件已被緩存,還是郵件已傳送到ROUTER,都無法解決。就我而言,我得到了所需的結果。

只是爲了記錄這是使用netmq完成的,但我想它也適用於ZeroMQ。

雖然我同意詹姆斯。 ZeroMQ(和netmq)至少應該提供一種方法來檢查隊列(並將消息取出),同時也是一種告訴各種套接字不要放棄消息的方法。最好的選擇是根據配置的選項以不及時的方式將消息發送到某種死信隊列。死信隊列然後可以分開處理。