ページをクロールするために人工呼吸器/ワーカー/シンクのパターンを設定しようとしてきましたが、テスト フェーズを通過することはありませんでした。私のセットアップの特徴の 1 つは、シンクが人工呼吸器と同じプロセスにあることです。すべてのノードは ipc:// トランスポートを使用します。現時点では、テスト メッセージのみが交換されます。人工呼吸器がタスクを送信し、ワーカーがタスクを受信して待機し、確認をシンクに送信します。
症状: しばらくすると (通常は 5 分以内)、人工呼吸器がタスクを送信し続け、ワーカーがタスクの受信と確認メッセージの送信を続けても、シンクは確認メッセージの受信を停止します。
シンクを再起動すると、不足しているすべてのメッセージが起動時に取得されるため、確認が送信されることはわかっています。
ZeroMQ は自動再接続を扱っていると思いました。
人工呼吸器/シンク
var push = zmq.socket('push');
var sink = zmq.socket('pull');
var pi = 0;
setInterval(function() {
push.send(['ping', pi++], zmq.ZMQ_SNDMORE);
push.send('end');
}, 2000);
push.bind('ipc://crawl.ipc');
sink.bind('ipc://crawl-sink.ipc');
sink.on('message', function() {
var args = [].slice.apply(arguments).map(function(e) {return e.toString()});
console.log('got message', args.join(' '));
});
worker.js
var pull = zmq.socket('pull');
var sink = zmq.socket('push');
sink.connect(opt.sink);
pull.connect(opt.push);
pull.on('message', function() {
var args = [].slice.apply(arguments).map(function(e) {return e.toString()});
console.log('got job ', args.join(' '));
setTimeout(function() {
console.log('job done ', args.join(' '));
sink.send(['job done', args.join(' ')]);
}, Math.random() * 5 * 1000);
});
編集シンクを別のプロセスに移動しようとしましたが、うまくいくようです。ただし、同じプロセスに存在することを本当に望んでおり、使用されるパターンに関係なく、プロセスごとに複数のzmqソケットを処理するときに同様の動作を観察しました
編集私はこのモジュールを使用していますhttps://github.com/JustinTulloss/zeromq.node