我正在使用nodejs运行一组worker。有一个内存泄漏,由于旧的和不熟悉的代码库,我决定通过定期杀死工人并用新的替换它们而不是诊断来解决。因此我基本上使用
setTimeout(() => {worker.disconnect();}, INTERVAL);
当我们产生一个工人时。
但是,我想确保当一个worker被杀死时,它会在断开连接之前完成当前处理的任何请求,这样就不会删除请求。通过试验库,调用worker.disconnect()
会丢弃当前正在处理的请求,从而导致“来自服务器的空回复”错误。由于边缘情况,我宁愿不手动实现逻辑来检测服务器当前是否正在处理请求(例如,通过维护一组活动请求等)。是否有一种“标准”方式告诉集群工作者“等到当前请求完成,然后退出”?
答案 0 :(得分:0)
据我所知,我发现了似乎有用的东西。策略是不让主服务器关闭工作人员,而是让工作人员在服务器close
之后关闭自己。主设备向其发送工作人员响应的消息。像(伪代码)
if (cluster.isMaster) {
var worker = cluster.fork();
// in 10 seconds, tell the worker to shutdown
setTimeout(() => {worker.send('shutdown');}, 10000);
} else {
var server = createServer(); // whatever server setup
server.listen(PORT);
process.on('message', (msg) => {
if (msg === 'shutdown') {
// disconnect from the cluster after the server closes
server.close(() => {
cluster.worker.disconnect();
}
}
}
}