...またはzmqは切断したクライアントをどのように処理しますか?クライアントが切断した場合にメッセージの受信を継続できるが、非常に多くの秒後にそれ自体の後でクリーンアップできるキューに、ある種のタイムアウトがありますか?
2 に答える
参照:http ://api.zeromq.org/2-1:zmq-setsockopt
ZMQソケットには、最高水準点の概念があります。
ドキュメントから:
The high water mark is a hard limit on the maximum number of outstanding messages ØMQ shall
queue in memory for any single peer that the specified socket is communicating with.
If this limit has been reached the socket shall enter an exceptional state and depending on
the socket type, ØMQ shall take appropriate action such as blocking or dropping sent messages.
zmqソケットのタイプ(REQ、REP、PUB、SUBなど)ごとに、メッセージの送信をブロックするかドロップするかなど、ドキュメントの動作を確認できます。
ほとんどの場合、クライアントが切断すると、メッセージがドロップされます。それが重要な場合は、ZMQパターンの上にメッセージの永続性と信頼性を構築する必要があります。
使用できる戦略はいくつかあり、ニーズによって異なります(すべてに当てはまる答えはありません)。
通常、クライアントが切断されると、サーバー側のキューは削除されます。これは、PUBからSUBへのフロー、およびPUSHからPULLへのフローに当てはまります。
頻繁な切断を処理したい場合は、ROUTER-DEALERを使用して、接続にIDを設定できます(接続する前に、DEALER側で)。その後、ROUTERは、DEALERが消えて戻ってきた場合でも、DEALERのメッセージをキューに入れます。次に、HWMを使用してそのキューのサイズを制限できます。
タイムアウトが必要な場合は、ZeroMQがメッセージを永久に保持するか、キューに入れられない場合はすぐにドロップするため、少し注意が必要です。サーバー内の独自のリスト構造でメッセージをキューに入れ、HWMを1に設定し、非ブロッキング送信を使用して、メッセージ用のスペースがあるため、メッセージをキューからプッシュする必要があります。次に、クライアントを自分で期限切れにして、それらに関連付けられているキューを削除できます。仕事のように聞こえますが、とてもシンプルです。