2

nodeJSでzeroMQを使用していました。しかし、プロデューサーからワーカーにデータを送信しているときに、setIntervalに入れないと、データがワーカーに送信されないようです。私のコード例は次のとおりです。

producer.js
===========           
     var zmq = require('zmq')
      , sock = zmq.socket('push');

    sock.bindSync('tcp://127.0.0.1:3000');
    console.log('Producer bound to port 3000');
    //sock.send("hello");
    var i = 0;

     //1. var timer = setInterval(function() {
      var str = "hello";
      console.log('sending work', str, i++);

     sock.send(str);
     //2. clearTimeout(timer);
     //3. }, 150);

    sock.on('message', function(msg) {
    console.log("Got A message, [%s], [%s]", msg);
   });

したがって、上記のコードで、1、2、および 3 でコメントされた行を追加し直すと、ワーカー側にメッセージが表示されますが、それ以外の場合は機能しません。

setIntervalに入れる必要があるメッセージを送信する理由を誰かが光を投げることができますか? それとも私は何か間違った方法をしていますか?

4

1 に答える 1

2

問題は node.js の zmq バインディングに隠されています。私はそれを掘り下げるのに少し時間を費やしましたが、基本的には send() でこれを行います:

  1. メッセージをキューに入れる
  2. バッファのフラッシュ

問題はフラッシング部分にあります。

  1. 出力ソケットの準備ができているかどうかを確認し、そうでない場合は戻ります
  2. エンキューされたメッセージをフラッシュする

あなたのコードでは、 bind を呼び出してすぐに送信するため、呼び出しの時点で接続されているワーカーはありません。したがって、メッセージはキューに入れられ、ワーカーが現れるのを待っています。ここで興味深いのは、新しいワーカーをどこでチェックするかということです。送信機能自体に!したがって、後で send() を呼び出さない限り、実際にいくつかのワーカーが接続されている場合、メッセージは決してフラッシュされず、永久にキューに入れられます。これが setInterval が機能する理由です。これは、ワーカーが通知して接続するのに十分な時間があり、存在するかどうかを定期的に確認するためです。

興味深い部分はhttps://github.com/JustinTulloss/zeromq.node/blob/master/lib/index.js#L277にあります。

乾杯 ;-)

于 2013-01-15T03:05:28.297 に答える