![](/img/trans.png)
[英]How to send integer values between server and client using zeromq(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.