6

クライアントが単一の要求メッセージをサーバーに送信し、一連のデータ メッセージを返すクライアント/サーバー セットアップがあります。サーバーは ROUTER ソケットを使用して実装され、クライアントは DEALER を使用して実装されます。通信は非同期です。クライアントは通常 iPad/iPhone であり、wifi 経由で接続するため、接続の信頼性は 100% ではありません。

私が懸念している問題は、クライアントがサーバーに接続してデータの要求を送信しても、応答メッセージが返される前に通信がダウンする場合です (wifi の範囲外など)。

この場合、メッセージはサーバー側でキューに入れられ、クライアントが再接続するのを待ちます。しばらくは問題ありませんが、最終的にはメッセージと接続をドロップしてリソースを解放したいと考えています。

アクティビティ/タイムアウトをチェックすることで、サーバーとクライアント アプリケーションで接続が失われたことを識別できます。クライアントはソケットをシャットダウンしてリソースを解放することができますが、サーバーでそれを行うにはどうすればよいでしょうか?

4

2 に答える 2

1

ZMQ FAQ によると:

ZeroMQ ソケット キューにあるすべてのメッセージをフラッシュするにはどうすればよいですか?

メッセージ キューから特定のメッセージまたはすべてのメッセージをフラッシュするための明示的なコマンドはありません。ZMQ_LINGER を 0 に設定し、ソケットを閉じて、未送信のメッセージを破棄することができます。

2013年からのこのメーリングリストの議論によると:

[送信メッセージ キューから] 古いメッセージを削除するオプションはありません。

最善の策は、ハートビートを実装し、1 つのクライアントが明示的に切断せずに応答を停止した場合、ROUTER ソケットを再起動することです。厄介なことですが、これは実際には HWM に付随するオプションを持つべきものです。Pieter Hintjens が参加していることは明らかです(彼は ZMQ を作成しました)。

于 2015-03-19T13:52:03.413 に答える