Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js群集失败,而不是重新定向到其他工作进程_Javascript_Node.js - Fatal编程技术网

Javascript Node.js群集失败,而不是重新定向到其他工作进程

Javascript Node.js群集失败,而不是重新定向到其他工作进程,javascript,node.js,Javascript,Node.js,我遇到了一个问题,我有两个worker运行Node.js集群,我使用for循环向worker发送大量请求。请求只针对一个工作进程,因为负载不足以让操作系统需要使用第二个工作进程。但是,当我杀死目标worker kill worker.pid时,不是让第二个worker继续接收请求,而是停止所有请求,并且带有for循环的程序挂起,最终失败/获得异常 我不想更改客户端的代码,也不知道如何在服务器端处理这个问题 这是我的服务器端代码: var cluster = require('cluster');

我遇到了一个问题,我有两个worker运行Node.js集群,我使用for循环向worker发送大量请求。请求只针对一个工作进程,因为负载不足以让操作系统需要使用第二个工作进程。但是,当我杀死目标worker kill worker.pid时,不是让第二个worker继续接收请求,而是停止所有请求,并且带有for循环的程序挂起,最终失败/获得异常

我不想更改客户端的代码,也不知道如何在服务器端处理这个问题

这是我的服务器端代码:

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)