来自nodejs服务器的请求过多导致“连接EADDRNOTAVAIL”

时间:2019-06-18 20:23:31

标签: javascript node.js http

在我的Node服务器(在Mac上运行)中,我正在使用websockets从外部API请求数据并将结果发送到我的云API。

WebSocket正在发送大量数据(1000+ obj / s)。当我尝试将其发布到我的云服务器时,在客户端(我的节点服务器)上出现错误。这仅在高负载期间发生,当负载较低时(例如300 / s),我不会出错。我没有发布到本地服务器,所以我不知道此错误意味着什么。

我注意到的一件事是端口未被重用。当我的负载很高时,我会在本地计算机上使用多达15000个以上的端口,然后开始出现这些错误。

我尝试在HTTP标头中设置“ agent:false”,但没有成功。我还尝试了“连接”:“保持活动”但未成功(在SO上找到了这两个建议)。

这是发布我从websocket获得的数据的代码:

function PostCode(codestring, apipathstring) {

    return new Promise((resolve,reject)=>{

        // An object of options to indicate where to post to
        var post_options = {
            host: 'hostname', //
            port: 'port',
            path: apipathstring,
            method: 'POST',
            headers: {
              'Content-Type': 'application/json',
              'Content-Length': Buffer.byteLength(post_data),
            }
        };

        // Set up the request
        var post_req = https.request(post_options,function(res){
            let data = '';
            res.setEncoding('utf8');

            // A chunk of data has been recieved.
            res.on('data', (chunk) => {
                data += chunk;
            });

            // The whole response has been received. Print out the result.
            res.on('end', () => {
                resolve(data);
            });

            // Error event received
            }).on("error", (err) => {
                reject("POSTING Error: " + err);    
            });

            post_req.write(post_data);
            post_req.end();
    })
}

理想情况下,我甚至可以流式传输高流量数据而不会出现这些连接错误。

以下错误:

Error: connect EADDRNOTAVAIL [my_cloud_IP] - Local (0.0.0.0:0)
Error: getaddrinfo ENOTFOUND [my_cloud_IP] [my_cloud_IP]:[my_cloud_port]

1 个答案:

答案 0 :(得分:0)

您可以创建自己的“保持活动”代理,并使用该特定代理发送所有HTTP请求:

    var endDate = new Date();
    endDate.setDate(new Date(localStorage.getItem("requestDate")).getDate() + 1);
    // Do your operations
    endDate.setTime(new Date(localStorage.getItem("requestDate")).getTime() + 24);

根据document

  

keepAlive ,即使没有未解决的请求,也可以保留套接字,因此无需重新建立TCP连接即可将其用于将来的请求。