簡體   English   中英

ZMQ - 客戶端服務器:客戶端意外關閉,服務器如何檢測到它?

[英]ZMQ - Client Server: Client is powered off unexpectedly, how server detects it?

多個客戶端連接到單個ZMQ_PUSH套接字。 當客戶端意外關閉時,服務器不會收到警報並繼續向其發送消息。 盡管使用的ZMQ_OBLOCK和設置ZMQ_HWM 5(隊列僅5在最大的消息),我的服務器沒有得到一個錯誤,直到除非客戶端重新連接,並在隊列中的所有消息立刻被接收。

我最近在使用ZMQ時遇到了類似的問題。 我們會切斷互連系統的電源,用戶將無法自動重新連接。 事實證明,最近(過去一年左右)已經實現了ZMTP的心跳機制,ZMTP是ZMQ套接字使用的底層協議。

如果您使用的是ZMQ 4.2.0或更高版本,請查看設置ZMQ_HEARTBEAT_IVL和ZMQ_HEARTBEAT_TIMEOUT套接字選項( http://api.zeromq.org/4-2:zmq-setsockopt )。 這些將設置心跳之間的間隔(ZMQ_HEARTBEAT_IVL)以及等待響應的時間,直到關閉連接(ZMQ_HEARTBEAT_TIMEOUT)。

編輯:您必須在連接之前設置這些套接字選項。

zmq中沒有任何內容可以檢測到套接字另一端的程序意外終止,或者網絡連接的無意義和意外故障。

有史以來一直在談論為zmq添加某種底層乒乓球你還活着的內部消息,但是上次我看(很久以前)已經決定不這樣做。

這確實意味着崩潰,網絡故障等不一定非常干凈地處理,並且您的應用程序不一定知道發生了什么或消息是否已成功發送。 畢竟是演員模特。 當你發現你的程序可能最終確定以前出錯的東西時。 zmtp中的超時將發現失敗,並最終將后果冒回到您的程序。

為了做得更好,你必須自己在桌面上打乒乓(例如有一個單獨的插座,以便你可以跟蹤客戶端的可達性)但是那時開始讓它變得非常難以使用ZMQ的部分如推/拉。 這可能是(優秀的)zmq作者決定不把它放在自己身上的原因。

面對類似的問題,我最終編寫了自己的傳輸庫。 在面對網絡故障,崩潰等時,我找不到一個現成的行為。它實現了CSP,而不是演員模型,不是非常快(不可避免),沒有在zmq中做模式感覺,但確實意味着程序始終知道消息的確切位置,並且知道客戶在任何時候都是活着的或無法訪問的。 CSPness還意味着消息傳輸是一個執行會合,因此程序也知道彼此正在做什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM