在我的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]
答案 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连接即可将其用于将来的请求。