nodejs:worker disconnect()按预期工作

我有一个请求路由“/断开连接”时试图断开工作人员与群集。 即使主人正在接收工人的断开连接事件,工作人员也不会断开连接。

工人

var express=require("express"), app=express(), http=require("http"), server = null; app.get('/disconnect',function(req,res){ var worker = require('cluster').worker; setTimeout(function(){ // disconnect from the cluster if(worker) worker.disconnect(); }, 2000); res.send("Worker " + worker.id + " is disconnecting "); }); server = http.createServer(app).listen(3000); server.on('close', function() { console.log("server asked to close"); }); 

LOG

 > node app/app_cluster.js CLUSTER: Worker 1 started CLUSTER: Worker 2 started CLUSTER: Worker 3 started CLUSTER: Worker 4 started Yay, the worker responded after it was forked Yay, the worker responded after it was forked Yay, the worker responded after it was forked Yay, the worker responded after it was forked A worker is now connected to null:3000 A worker is now connected to null:3000 A worker is now connected to null:3000 A worker is now connected to null:3000 CLUSTER: Worker 1 disconnected from the cluster. events.js:85 throw er; // Unhandled 'error' event ^ Error: IPC channel is already disconnected at process.target.disconnect (child_process.js:510:26) at Worker.disconnect (cluster.js:650:13) at null._onTimeout (/home/user/nodejs/node-hawkeye/app/app.js:18:31) at Timer.listOnTimeout (timers.js:110:15) CLUSTER: Worker 1 died with exit code 1 (null) 

我在这里有两个疑问

  1. 对于“/ disconnect”路由的第一个请求,我看到“CLUSTER:Worker 1与集群断开连接”。 在日志中。 我等待大约10秒,再次发送请求到“/断开”路线。 当我第二次发送时,我得到错误“错误:IPC通道已经断开”。

  2. 根据文档https://nodejs.org/api/cluster.html#cluster_worker_disconnect

    在工作人员中,此function将closures所有服务器,等待这些服务器上的“closures”事件,然后断开IPC通道。

    我没有看到在我的工人代码服务器上的closures事件。 worker会在worker.disconnect()内部调用server.close()吗?

我的第一个疑问得到澄清。 在Master中“断开”事件之后,花了将近两分钟的时间才收到“退出”事件。 对于我的testing用例,我等了大约10秒,在第一次请求之后发送请求到“/ disconnect”路由,似乎10秒是不够的。 请参阅下面的日志,我在日志中捕获事件的时间。

日志

 > node app/app_cluster.js CLUSTER: Worker 1 started CLUSTER: Worker 2 started CLUSTER: Worker 3 started CLUSTER: Worker 4 started Yay, the worker responded after it was forked Yay, the worker responded after it was forked Yay, the worker responded after it was forked Yay, the worker responded after it was forked A worker is now connected to null:3000 A worker is now connected to null:3000 A worker is now connected to null:3000 A worker is now connected to null:3000 CLUSTER: Worker 3 disconnected from the cluster.Tue Aug 11 2015 13:45:35 GMT+0530 (IST) CLUSTER: Worker 3 died with exit code 0 (null)Tue Aug 11 2015 13:47:29 GMT+0530 (IST) 

UPDATE

我不确定在'断开'和'退出'事件之间是否可以接受2分钟,但是,似乎一个检查worker.isConnected()知道IPC连接的状态。

文档https://nodejs.org/api/cluster.html#cluster_cluster_workers中有警告

员工断开并退出之后,员工将从cluster.workers中删除。 这两个事件之间的顺序不能事先确定。 但是,保证从cluster.workers列表中删除发生在上次'disconnect'或'exit'事件发生之前。

如果是这种情况,我不知道如何处理传入的请求,如果IPC通道死了,请求来到断开的工人。

.disconnect()closuresIPC(进程间通信)通道,server.close()closures服务器,以处理任何新的入站请求…这些closures不同的端点(一个closures连接到主站和其他进程,其他进程closures到外面)。

在工作人员立即断开连接,只是断开连接,没有时间做closures或任何事情…

如果你看一下文档中的例子,你可以看到它发送一个来自master的消息,当worker收到这个消息时,会触发disconnect和kill timer。