2012-10-08 139 views
3

我有一個客戶端(PULL)連接到服務器(PUSH)。起初他們工作得很好。但後來連接中斷,客戶端ZeroMQ不嘗試重新連接到服務器。ZeroMQ客戶端丟失連接

一個神祕的事情是,如果我在客戶端和服務器端執行netstat,客戶端顯示連接仍然​​是ESTABLISHED,而服務器端沒有相應的條目。我想這是客戶端不重新連接的原因。

PS:客戶端和服務器處於不同的IDC中,它們之間存在帶寬限制。但是當斷開連接發生時,我們的顯示器顯示它沒有達到頻段限制。

而且,當我在服務器端做的netstat(連接是罰款),有時發送-Q列是非常大的,然後下降到0

這就是我掌握的信息。如果你需要更多的細節,請告訴我。

+1

什麼語言?任何代碼示例?如果你正在殺死你的上下文(超出範圍?),那麼套接字將不會重新連接...通常,如果一切仍然存在,zmq將處理連接丟失,並且沒有太多問題... – g19fanatic

+0

您是否發現了更多這方面的信息?我正在使用C#綁定(clrzmq)並且遇到類似這樣的事情。我使用了一個連接多個終端的SUB插座,並且突然間所有傳入的數據都將丟失。如果我撥打斷開連接並再次連接(在客戶端),所有的都很好。如果我可以再次發生這種情況,請參考netstat。 –

+0

可能會補充說我已經實施了強制斷開連接檢測(使用心跳和超時),強制ZeroMQ套接字斷開/連接暫時無聲的終端。這不幸的是,雙方的所有隊列將因「重置」連接而被丟棄。 –

回答

2

我意識到這是一個非常古老的問題,但我碰到幾乎完全相同的問題,並發現這一點,同時試圖找到一個修復程序。我相信我已經解決了我的問題,希望這可以幫助某個人。

我有同樣的情況,但與ROUTER->ROUTER。一切工作起初都很順利,但在不發送任何消息約15分鐘後,消息就不會再發送消息了。然後我發現:http://api.zeromq.org/3-2:zmq-setsockopt。爲我工作的三個套接字選項是(使用pyzmq):

# self.client is my socket here 
self.client.setsockopt(zmq.TCP_KEEPALIVE, 1) 
self.client.setsockopt(zmq.TCP_KEEPALIVE_IDLE, 300) 
self.client.setsockopt(zmq.TCP_KEEPALIVE_INTVL, 300) 

這些覆蓋操作系統設置,我不再看到連接超時或下降。