Javascript Node.js群集失败,而不是重新定向到其他工作进程
我遇到了一个问题,我有两个worker运行Node.js集群,我使用for循环向worker发送大量请求。请求只针对一个工作进程,因为负载不足以让操作系统需要使用第二个工作进程。但是,当我杀死目标worker kill worker.pid时,不是让第二个worker继续接收请求,而是停止所有请求,并且带有for循环的程序挂起,最终失败/获得异常 我不想更改客户端的代码,也不知道如何在服务器端处理这个问题 这是我的服务器端代码:Javascript Node.js群集失败,而不是重新定向到其他工作进程,javascript,node.js,Javascript,Node.js,我遇到了一个问题,我有两个worker运行Node.js集群,我使用for循环向worker发送大量请求。请求只针对一个工作进程,因为负载不足以让操作系统需要使用第二个工作进程。但是,当我杀死目标worker kill worker.pid时,不是让第二个worker继续接收请求,而是停止所有请求,并且带有for循环的程序挂起,最终失败/获得异常 我不想更改客户端的代码,也不知道如何在服务器端处理这个问题 这是我的服务器端代码: var cluster = require('cluster');
var cluster = require('cluster');
if(cluster.isMaster){
for(var j=0; j<2; j++)
cluster.fork();
cluster.on('online', function(worker){
console.log('worker ' + worker.process.pid + ' alive');
});
cluster.on('exit', function(worker, code, signal){
console.log('worker ' + worker.process.pid + ' died');
cluster.fork();
});
}
else {
/*Includes and global variables*/
var http = require('http');
http.createServer(function (req, res){
var headers = {};
headers["Access-Control-Allow-Origin"] = "*";
headers["Access-Control-Allow-Methods"] = "POST, GET, PUT, DELETE, OPTIONS";
headers["Access-Control-Allow-Credentials"] = true;
headers["Access-Control-Allow-Headers"] = "X-Requested-With, Access-Control-Allow-Origin, X-HTTP-Method-Override, Content-Type, Authorization, Accept";
res.writeHead(200, headers);
console.log("test");
res.end("Response sent");
}).listen(8070);
}
想法是,如果req.url=='/exit'{process.exit;}尝试添加一个退出路由,以查看它是否以这种方式正确处理事情,或者可能添加一个相同的抛出路由,但抛出一个错误。您还可以研究如何处理信号.did console.log'worker'+worker.process.pid+'died';记录在案?工人的死亡确实记录在案。我试过你的建议,但没用。我目前正在努力处理这些信号;我会让你知道这是怎么回事。仅供参考,0.10.x中当前版本的群集被认为是。令人不快的在0.12.x中,它被转换为循环,这是更好的,但更常见的是,只需在不同端口上启动多个node.js服务器,然后进行负载平衡。或者只使用一个node.js服务器,您可能实际上不需要多次尝试来避免单点故障导致的单服务器情况。对于负载平衡node.js服务器,您有什么建议吗?
for(int i=0;i<2000;i++)
{
payLoad = "{\"otoo\":{\"keyName"+i+"\":\"valueName"+i+"\"}}";
System.out.println(payLoad);
StringEntity reqEntity = new StringEntity(payLoad);
reqEntity.setContentType("application/json");
httpPostRequest.setEntity(reqEntity);
HttpResponse httpResponse = httpClient.execute(httpPostRequest);
System.out.println("----------------------------------------");
System.out.println(httpResponse.getStatusLine());
System.out.println("----------------------------------------");
HttpEntity entity = httpResponse.getEntity();
byte[] buffer = new byte[1024];
if (entity != null) {
InputStream inputStream = entity.getContent();
try {
int bytesRead = 0;
BufferedInputStream bis = new BufferedInputStream(
inputStream);
while ((bytesRead = bis.read(buffer)) != -1) {
chunk = new String(buffer, 0, bytesRead);
System.out.println(chunk);
}
} catch (IOException ioException) {
ioException.printStackTrace();
} catch (RuntimeException runtimeException) {
httpPostRequest.abort();
runtimeException.printStackTrace();
} finally {
try {
inputStream.close();
} catch (Exception ignore) {
}
}
}
}
org.apache.http.NoHttpResponseException: 173.36.55.252:8070 failed to respond
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:143)
at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:283)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:251)
at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:197)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:685)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:487)
at org.apache.http.impl.client.AbstractHttpClient.doExecute(AbstractHttpClient.java:863)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
at CprWrite.main(CprWrite.java:48)