您好我正在使用Node.js群集模块运行我的应用程序,并且我正在尝试找到一种优雅地退出工作者而不会丢失任何请求的方法。
所以我使用 server.close()来停止接受新请求但是如何知道正在处理的实际请求是否已经完成?
我提出了这个很好的黑客攻击:
var http = require('http');
var server = http.createServer(function(res, req) {
setTimeout(function() { // simulate a request which takes time (1sec) to finish
req.end('hallo');
}, 1000);
}).listen(8080);
server._requests = 0;
server.on('request', function(req, res) {
server._requests += 1;
res.once('finish', function() {
server._requests -= 1;
if (server._requests === 0)
server.emit('no_more_requests');
});
});
function gracefulExit() {
server.close();
if (server._requests === 0) process.exit(0); // exit right away
server.once('no_more_requests', process.exit); // or wait
}
process.on('SIGTERM', gracefulExit);
process.on('SIGINT', gracefulExit);
但有更优雅的方式吗?
答案 0 :(得分:1)
您不必手动关闭服务器。相反,您可以unref()
服务器。这告诉节点,只要该服务器对象不再被使用,并且没有其他类似的资源被使用,那么该过程就可以退出。
有关详细信息,请参阅nodejs server.unref()
doc。
请注意,您无法立即执行此操作,因为您的服务器将启动,并且在处理任何请求之前进程将退出。相反,您需要在服务器运行之后的某个时间决定,然后您想要server.unref()
它并让它关闭。
注意,node.js中的计时器存在相同的功能,因此您可以决定计时器是否应该保持处理正常运行。