节点集群:在断开连接工作之前确保请求完成

时间:2017-06-26 18:39:49

标签: node.js cluster-computing

我正在使用nodejs运行一组worker。有一个内存泄漏,由于旧的和不熟悉的代码库,我决定通过定期杀死工人并用新的替换它们而不是诊断来解决。因此我基本上使用

setTimeout(() => {worker.disconnect();}, INTERVAL);

当我们产生一个工人时。

但是,我想确保当一个worker被杀死时,它会在断开连接之前完成当前处理的任何请求,这样就不会删除请求。通过试验库,调用worker.disconnect()会丢弃当前正在处理的请求,从而导致“来自服务器的空回复”错误。由于边缘情况,我宁愿不手动实现逻辑来检测服务器当前是否正在处理请求(例如,通过维护一组活动请求等)。是否有一种“标准”方式告诉集群工作者“等到当前请求完成,然后退出”?

1 个答案:

答案 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();
      }
    }
  }
}