Node.js域集群工作程序断开连接
Node.js domain cluster worker disconnect
查看nodejs域文档页面上给出的示例:http://nodejs.org/api/domain.html,建议使用集群重新启动工作程序的方法是在工作程序部分调用firstdisconnect,并在主程序部分侦听disconnect事件。但是,如果您只是复制/粘贴给定的示例,您会注意到disconnect()调用不会关闭当前工作程序:
这里发生的是:
try {
var killtimer = setTimeout(function() {
process.exit(1);
}, 30000);
killtimer.unref();
server.close();
cluster.worker.disconnect();
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!'n');
} catch (er2) {
console.error('Error sending 500!', er2.stack);
}
我在错误处执行获取请求
- 计时器启动:在30秒内,如果还没有,进程将被终止
- http服务器已关闭
- 工作人员已断开连接(但仍处于活动状态)
- 显示500页
我在错误时(30秒之前)进行第二次获取请求
- 新计时器已启动
- 服务器已关闭=>引发错误
- 错误被捕获在"catch"块中,并且没有结果被发送回客户端,因此在客户端,页面正在等待,没有任何消息
在我看来,最好只是杀死工人,然后听主部件上的"退出"事件再次分叉。这样,500错误总是在错误期间发送:
try {
var killtimer = setTimeout(function() {
process.exit(1);
}, 30000);
killtimer.unref();
server.close();
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!'n');
cluster.worker.kill();
} catch (er2) {
console.error('Error sending 500!', er2);
}
我不确定使用kill而不是disconnect的负面影响,但似乎disconnect正在等待服务器关闭,但这似乎不起作用(至少不像应该的那样)
我只是想得到一些反馈。这可能是我错过的一个很好的理由。
感谢
编辑:
我刚刚检查了旋度,效果很好
然而,我之前正在使用Chrome进行测试,在发回500响应后,Chrome似乎会在服务器实际关闭之前发出第二个请求
在这种情况下,服务器正在关闭而未关闭(这意味着工作程序也在断开连接而未断开连接),导致第二个请求由与以前相同的工作程序处理,因此:
- 它阻止服务器完成关闭
- 正在评估的第二个
server.close();
行会触发异常,因为服务器未关闭 - 以下所有请求都将触发相同的异常,直到调用killtimer回调
我发现,实际上,当服务器关闭并同时收到请求时,它会停止关闭过程
所以他仍然接受连接,但不能再关闭了。
即使没有集群,这个简单的例子也说明了这一点:
var PORT = 8080;
var domain = require('domain');
var server = require('http').createServer(function(req, res) {
var d = domain.create();
d.on('error', function(er) {
try {
var killtimer = setTimeout(function() {
process.exit(1);
}, 30000);
killtimer.unref();
console.log('Trying to close the server');
server.close(function() {
console.log('server is closed!');
});
console.log('The server should not now accepts new requests, it should be in "closing state"');
res.statusCode = 500;
res.setHeader('content-type', 'text/plain');
res.end('Oops, there was a problem!'n');
} catch (er2) {
console.error('Error sending 500!', er2);
}
});
d.add(req);
d.add(res);
d.run(function() {
console.log('New request at: %s', req.url);
// error
setTimeout(function() {
flerb.bark();
});
});
});
server.listen(PORT);
刚刚运行:
curl http://127.0.0.1:8080/ http://127.0.0.1:8080/
输出:
New request at: /
Trying to close the server
The server should not now accepts new requests, it should be in "closing state"
New request at: /
Trying to close the server
Error sending 500! [Error: Not running]
现在单一请求:
curl http://127.0.0.1:8080/
输出:
New request at: /
Trying to close the server
The server should not now accepts new requests, it should be in "closing state"
server is closed!
因此,例如,chrome再请求一个favicon,服务器就无法关闭。
现在,我将继续使用worker.kill(),这使worker不必等待服务器停止。
大约6个月前,我遇到了同样的问题,遗憾的是,我没有任何代码可以演示,就像我以前的工作一样。我通过显式地向工作人员发送消息并同时调用disconnect来解决此问题。断开连接可以防止工作人员承担新的工作,在我的情况下,当我跟踪工作人员正在做的所有工作时(这是一个上传服务,有长时间的上传),我可以等到所有工作完成,然后以0退出。
- importScripts在web工作程序中返回未定义的
- 读取在具有IE的工作程序中生成的对象URL
- 使用web工作程序进行多个并发繁重计算
- Chrome没有加载最新版本的web工作程序脚本(运行缓存版本)
- web工作程序中不同的服务器请求行为
- Firebase推送通知-节点工作程序
- Node.js域集群工作程序断开连接
- fetch事件处理程序中的fetch()未触发服务工作程序中的fetch事件
- Async.js队列工作程序未完成
- Web工作程序在处理大型数组时内存不足
- 附加组件生成器:使用端口的多个工作程序
- js web工作程序内存泄漏
- 在执行不区分大小写的排序以删除web工作程序中的重复项时,首选大写字母唯一
- Web工作程序在传递具有数组缓冲区的大型对象数组时会崩溃Chrome选项卡
- 从node.js派生出多个phantomjs工作程序是否理想
- 从web工作程序和主浏览器线程访问相同的websql数据库
- 没有web工作程序的Javascript后台处理
- 如何通过javascript工作程序显示循环进程状态
- 检测正在运行的javascript工作程序
- 正在检索web工作程序中所有变量的列表