2017-12-27 868 views
1

我有一個ZeroMQ ROUTER/DEALER一對形式通信原型,用於兩臺計算機之間的異步通信。如何配置ZeroMQ ROUTER套接字以繼續嘗試長時間發送包?

如果與DEALER插座計算機進入離線了一會兒,回來的時候,一些消息都將丟失。

我也明白,ZeroMQ不能無限期持有的消息,因爲沒有保證DEALER側的是還會回來。我正在尋找方法來配置這種行爲 - 有沒有一種設置可以用來控制消息在放棄之前保存多久?

什麼設置可能會影響此行爲?

我不認爲這個問題是關係到高水位設置的值,所傳送的數據量是相當低的。

Windows上的ZeroMQ版本4.0.4。

我不知道究竟是什麼將是代碼顯示的相關部分。而且,將事情擺脫背景並使其易於理解並不是完全直截了當的。我會嘗試,所以在這裏。

這是路由器插座如何初始化:

router-socket (doto (zmq/socket zmq-context :router) 
        (zmq/set-receive-timeout 100) 
        (zmq/set-recv-hwm 0) 
        (zmq/set-send-hwm 0) 
        (zmq/bind (str "tcp://*:" (:port request-handler)))) 

發送郵件使用ZMQ /發送功能。

即使沒有Clojure的經驗zeromq部分應該是清楚的。

這裏的經銷商如何初始化(C#):

var dealer = context.CreateSocket(SocketType.DEALER); 
dealer.SendHighWatermark = 0; 
dealer.ReceiveHighWatermark = 0;  

的信息的接收使用ZmqSocket.ReceiveMessage方法(當然,實際上這是在SendReceiveExtensions類的擴展方法,但無論如何)。

一個(可能是主),其中包損失發生時運行經銷商計算機進入睡眠狀態(=膝上型蓋關閉),並且之後喚醒一些分鐘的情況。就像我在我原來的問題中所說的那樣,我認爲由於路由器暫時放棄返回的經銷商並因此丟棄消息而丟失了包裹。但這只是一個假設,原因也可能是別的。

回答

-1

因此,我們先來看看ZeroMQ Context()-引擎設置,這是ZeroMQ中使用.setsockopt()方法的功能運行智能信令/消息傳遞的所有低層次內容的最終權威。

對於真實世界的故障排除,沒有什麼比一刀切的,因此沒有任何代碼,有很多事情可以通過猜測和過去的麻煩,滿足。

雖然一些根本原因的東西實際上可能被ZeroMQ過程的其他一些習慣所掩蓋,在引擎蓋下運行,但下面的文本更多地是關於平衡行爲藝術的一個儘可能廣泛的視角,而不是一步一步的導航。

剛超過幾句話,將這些嫌疑人做起,從智能API選項長長的名單:


ZMQ_RECONNECT_IVL:設置連接區間

ZMQ_RECONNECT_IVL購股權爲指定的套接字設置初始重新連接間隔。重新連接間隔是ØMQ在使用面向連接的傳輸時嘗試重新連接斷開的對等端之間等待的時間。

與在降低開銷的等待時間幫助更新丟失的低級別的連接過程中倖存的虛假LOS和類似的服務輟學下文提到的戰略展望從~ 100 [ms]短一些2 [ms]與調整ZMQ_RECONNECT_IVL_MAX幾個其倍數,可以一起。

Ref。也可以通過ZMQ_TCP_KEEPALIVE_{CNT | IDLE | INTVL}ZMQ_TCP_MAXRT和O/S覆蓋(可在支持O/S的地方使用)。


這其中將突出狀態,當同齡人都沒有連接,因此該消息傳遞策略可能會調整在用戶的應用程序代碼,觀察病例:

ZMQ_IMMEDIATE:將消息僅排隊到已完成的連接

默認情況下,即使連接尚未完成,隊列仍將填充傳出連接。這可能導致帶有循環路由的套接字上的「丟失」消息(REQ,PUSH,DEALER)。如果此選項設置爲1,則消息只應排隊等待完成的連接。如果沒有其他連接,這將導致套接字阻塞,但會阻止隊列填充等待連接的管道。

隨着類似的策略,正如上面貼的DEALER側的,ROUTER側可以使用ZMQ_PROBE_ROUTER設置,以便引導到ROUTER插座


如果主要可能的,並且連接如果在成本方面仍然合理,可以使用定期注入的「服務」聲納嘟嘟聲:

ZMQ_HEARTBEAT_IVL:發送ZMTP之間設置間隔心跳

ZMQ_HEARTBEAT_IVL選項將設置發送ZMTP心跳對指定的插槽之間的間隔。如果設置此選項並且大於0,則每隔ZMQ_HEARTBEAT_IVL毫秒發送一次PING ZMTP命令。

ZMQ_HEARTBEAT_TIMEOUT:爲ZMTP設置超時心跳

ZMQ_HEARTBEAT_TIMEOUT選項將設置多長時間超時;發送PING命令ZMTP並沒有收到任何流量後,連接之前要等待。此選項僅在ZMQ_HEARTBEAT_IVL也設置且大於0時有效。如果在發送PING命令後沒有收到流量,但連接將超時,但接收的流量不必是PONG命令 - 任何接收到的流量將取消超時。

ZMQ_HEARTBEAT_TTL:設置TTL值ZMTP心跳

ZMQ_HEARTBEAT_TTL選項應當建立遠程對等的超時ZMTP心跳。如果這個選項大於0,如果在TTL週期內沒有收到更多的流量,遠程端會超時。如果ZMQ_HEARTBEAT_IVL未設置或爲0,則此選項不起作用。在內部,該值向下舍入到最接近的十分位,任何小於100的值都不起作用。


ZMQ_CONNECT_TIMEOUT:設置connect()超時

設置了多久時間,出connect()系統調用來等待。系統調用通常需要很長時間纔會返回超時錯誤。設置此選項可讓庫在較早的時間間隔超時。

設置幾個[ms]可能有助於清除間歇性中斷和/或在它們之間打開新的服務窗口。爲了允許這種短窗策略工作,還應該減少ZMQ_HANDSHAKE_IVL所允許的最大值。


ZMQ_BACKLOG:未完成的連接

的隊列的設置最大長度

ZMQ_BACKLOG選項應設定爲指定的套接字優秀的對等連接的隊列的最大長度;這僅適用於面向連接的傳輸。有關詳細信息,請參閱您的操作系統文檔,以獲取listen函數。

這裏有一百個服務器可以運行良好,但沒有關於「丟失」連接數的詳細信息,讓我們將它保留在故障排除者的購物清單上。

+0

感謝您的全面回答! 我添加了代碼示例和一些問題的進一步說明。 我還沒有嘗試過您所描述的設置。我會在下面對他們發表評論。 –

+0

ZMQ_RECONNECT_IVL - 如果我理解正確,這會影響zeromq在可以重新建立後多快恢復連接。目前這不是問題 - 重新連接很快就會發生。然而,一旦這樣做,運行經銷商的代碼會發現一些消息丟失(它們被編號以便能夠注意到這種情況)。 –

+0

ZMQ_TCP_MAXRT - 來自http://api.zeromq.org/4-2:zmq-setsockopt:「網絡中斷後,可能需要很長時間才能重新建立會話。設置此選項允許超時發生在一個較短的時間間隔。「 我對文檔進行了解釋,這也影響了會話重新建立的時間。它似乎不被認爲會影響消息的丟失。 –

相關問題