天天看點

Chapter 2 - Sockets and Patterns【選譯,哈哈】 Part 9 Missing Message Problem Solver

 下面是這張圖表的總結:

在SUB套接字上,使用ZMQ_SUBSCRIBE的zmq_setsockopt()設定訂閱,否則将得不到消息。因為您通過字首訂閱消息,如果您訂閱“”(空訂閱),您将獲得所有内容。

如果您在PUB套接字開始發送資料之後啟動SUB套接字(即,建立到PUB套接字的連接配接),您将丢失它在建立連接配接之前釋出的所有資料。如果這是一個問題,請設定您的體系結構,使SUB套接字首先啟動,然後PUB套接字開始釋出。

即使同步了SUB和PUB套接字,仍然可能會丢失消息。這是因為在實際建立連接配接之前,不會建立内部隊列。如果你可以切換綁定/連接配接方向,讓SUB套接字綁定,PUB套接字連接配接,你可能會發現它的工作方式更像你期望的。

如果您正在使用REP和REQ套接字,并且沒有堅持同步send/recv/send/recv指令,ZeroMQ将報告錯誤,您可能會忽略這些錯誤。那樣的話,就會顯得你在丢失資訊。如果您使用REQ或REP,請堅持send/recv順序,并且始終在實際代碼中檢查ZeroMQ調用的錯誤。

如果您正在使用PUSH套接字,您将發現第一個要連接配接的PULL套接字将擷取不公平的消息共享。消息的準确旋轉隻發生在所有PULL套接字都成功連接配接時,這可能需要一些毫秒。作為PUSH/PULL的替代方案,為了降低資料速率,可以考慮使用ROUTER/DEALER和負載平衡模式。

如果您正在跨線程共享套接字,請不要這樣做。它會導緻随機的奇怪,和崩潰。

如果您正在使用inproc,請確定兩個套接字處于相同的上下文中。否則,連接配接端實際上會失效。同樣,先綁定,再連接配接。Inproc不是像tcp那樣的斷開連接配接的傳輸。

如果您正在使用ROUTER套接字,那麼通過發送錯誤的辨別幀(或忘記發送辨別幀),很容易意外地丢失消息。一般來說,在ROUTER套接字上設定ZMQ_ROUTER_MANDATORY選項是個好主意,但在每次發送調用時也要檢查傳回代碼。

最後,如果您真的不能找出問題出在哪裡,那麼就做一個重制問題的最小測試用例,并向ZeroMQ社群尋求幫助。