Node.js 节点群集:确保在断开工作进程之前完成请求

Node.js 节点群集:确保在断开工作进程之前完成请求,node.js,cluster-computing,Node.js,Cluster Computing,我正在用nodejs管理一群工人。有一个内存泄漏,由于一个旧的和不熟悉的代码库,我决定通过定期杀死工人并用新的工人替换他们来修复,而不是诊断。因此,我基本上使用 setTimeout(() => {worker.disconnect();}, INTERVAL); 当我们产生一个工人 但是,我想确保当一个工作进程被杀死时,它会在断开连接之前完成当前正在处理的任何请求,这样请求就不会被丢弃。在对库进行实验时,调用worker.disconnect()会删除当前正在处理的请求,从而导致“来自

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

setTimeout(() => {worker.disconnect();}, INTERVAL);
当我们产生一个工人


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

因此,据我所知,我发现了一些似乎有效的方法。策略是不让主服务器关闭工作服务器,而是让工作服务器在关闭服务器后自行关闭。主机向其发送一条消息,工作人员对此做出响应。比如(伪代码)

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