3

node.js サーバーからワーカーにメッセージをプッシュするためにzeromqを使用しています。routernode.js 側にソケットを作成します

var sender = zmq.socket('router');
sender.bind('tcp://127.0.0.1:6633', function(err) {
  if (err) {
    console.log( 'Error binding socket' );
    return;
  }
  console.log('OK!');
}

dealerワーカーコードに a を使用して、このアドレスに接続します。

この問題は、バインドの前にワーカーが最初に接続したときに発生します (常にではありませんが、非常に頻繁に発生します)。これは zeromq ドキュメントに関する問題ではないはずなので、node.js バインディングの問題だと思います。問題は、これをどのように解決できるかということです。

また、関数ではなく でこの例外をキャッチできるというSocket is busy問題process.on('uncaughtException',...)bind

Windows 7 64ビットでこれを行っていることに言及する必要があります。

4

1 に答える 1

7

問題はおそらく、実際には bindSync() を使用すべき場所で bind() を使用していることです。ソースを読むと、async bind() が実際にソケットをロックし、何かを行うたびにロックをチェックしていることがわかります。おそらく経験しているのは、ワーカーがソケットのロックが解除される前に接続するため、例外がスローされることです。bind() を bindSync() に置き換えるだけでうまくいきました。ただし、それは私が推測するアイデアの解決策ではなく、むしろ node.js っぽいものではありません。私が何を意味するかを示しましょう:

var zmq = require('zmq')
  , sender;
sender = zmq.socket('router');
sender.bind('tcp://127.0.0.1:6633', function(err) {
  if (err) {
    console.log( 'Error binding socket' );
    return;
  }
  sender.close(); // This is fine! The socket is ready!
});

sender.close(); // This is wrong! The socket is not ready yet!

したがって、bindSync() を呼び出して気にしないか、bind() を呼び出してコールバックで作業を続行することができますが、bind() を使用して終了を待たずに続行することは絶対にできません。bindSync() を使用するとコードが読みやすくなりますが、呼び出し中に node.js インスタンス全体がブロックされます。したがって、node.jsを使用する必要があるという点で、bind()の方法はよりクリーンだと思います...

これが役に立てば幸いです;-)

于 2013-01-15T11:45:41.823 に答える