我一直在尝试设置呼吸机/工作人员/接收器模式以便抓取页面,但我从未经历过测试阶段。我的设置的一个特点是水槽与呼吸机处于同一过程中。所有节点都使用ipc:// transport。目前只交换测试消息。呼吸机发送任务,工作人员接收任务,等待然后向水槽发送确认信息。
症状:在一段时间后(通常少于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套接字时观察到类似的行为,无论使用何种模式
答案 0 :(得分:4)
我不一定希望接受这个答案,但我会把它放在这里作为参考。有一个非常忠实的仅节点模块,名为Axon,受到ZeroMQ的启发。
注意: ZMQ和Axon无法互操作。
答案 1 :(得分:2)
不确定您是使用基础AMQP客户端还是使用它的软件包,我与RabbitMQ有类似的问题。实际进程仍在运行(setInterval工作)
我正在通过来自主进程的cluster.fork运行我的服务/工作者...主进程中有一些监听器在退出时重新启动工作者/服务...在我的工作者内部我有一个运行的setInterval每隔X秒,如果在此期间没有完成任何工作,我就有了我的worker process.exit(主进程监听器将启动一个新的fork)。这对我来说足够的弹性。通过让几个工作人员运行(监听队列),工作仍然完成。
正如另一个建议,我一直在考虑转换到Axon,因为我所有的MQ接口当前都通过Node。我的其他系统通过NodeJS驱动的API服务进行连接。就此而言,通过API服务公开您可能需要的内容可能不会太难。