1

私はZMQをかなり使い始めており、NodeJSバインディングを使用しています。PUSH/PULLソケットを使用するアプリケーションがあります。一方では、ソケットPUSHを介してそれを受信して​​処理するいくつかのノードにデータを送信します。PULLアプリケーションの1つ以上のノードを強制終了しなければならない場合がありますが、これらのノードのPULLソケットに処理対象のデータが残っている場合があります。このデータを失いたくないので、ZMQのPULLソケットキューにアクセスして、処理するメッセージがまだあるかどうかを確認する方法があるかどうか疑問に思いました。

ZMQとNodeJSバインディングの仕様には実際には何も見つからなかったので、概念全体が間違っている可能性があります。

4

2 に答える 2

0

プロセスを強制終了すると、そのプロセスのバッファ内のデータはすべて失われます。

プロセスを強制的に強制終了するのではなく、プロセスを正常にシャットダウンできるようにする方法を常に見つける必要があります。ここでは、「KILL」メッセージをPULLソケットに送信できます。プロセスはそれを読み取り、受信すると終了します。ソケットバッファをフラッシュできる場合(まだ送信している他のプロセスがあるかどうかによって異なります)、それを実行して、読み取るメッセージがなくなったら終了できます。

于 2012-12-11T13:01:51.563 に答える
0

見つけた解決策を投稿しています。キューにメッセージがもうないことを確認するためにZMQソケットを使用していないため、これは実際には解決策ではありません。これは、問題を機能させるために頭に浮かんだ回避策/ハックにすぎません。自分でキュー処理を書く時間がないので、次のようにして問題を解決しました。

プロセスは、処理するメッセージを受信するたびに、を介してタイムスタンプを保存しnew Date().getTime()ます。プロセスを強制終了する必要があるときはいつでも、killメッセージがプロセスに送信されます。プロセスはメッセージを受信すると、でタイムアウトを開始しsetIntervalます。毎秒x(私は10を入れますが、多かれ少なかれ)タイムアウトは、最後に受信したメッセージが十分に古いかどうかをチェックする関数を起動します(タイムスタンプを取得し、最後に保存されたメッセージからこのtsを減算し、結果がそれより大きい場合はy、私の場合は100秒ですが、十分に古いです)。そうである場合は、これ以上メッセージが受信されていない(キューにメッセージがない)ことを意味するため、プロセスが強制終了されます。それ以外の場合は何も実行されません。

于 2012-12-13T09:31:16.713 に答える