在更新我的服务器软件包之后,几天前我开始遇到问题。
问题是,当两个请求同时发出时(两次外部调用我的API),它会返回" Socket Hang Up"错误即可。
我的API就像一个代理,它接收请求处理它们并向远程服务器发送另一个请求,等待响应,处理响应并返回一些数据。
这是一个例子
我的第一个请求
getPublicIpAddressIpify(req, callback) {
request.get({
url: 'https://api.ipify.org?format=json'
}).then((response) => {
if (response) {
let jsonResult = JSON.parse(response);
callback.onSuccess(jsonResult['ip']);
}
else {
throw new Error("Cannot determine public ip");
}
})
.catch((error) => {
callback.onError(error);
});
}
我的第二个请求
getFrontPage(req, callback) {
request.get({
resolveWithFullResponse: true,
url: 'https://google.com'
}).then((response) => {
// Handle response
})
.catch((error) => {
callback.onError(error);
});
}
因此,当这些请求大约同时发出时,会发生套接字挂起。
这是调试输出
{ request:
{ debugId: 1,
uri: 'https://api.ipify.org/?format=json',
method: 'GET',
headers: { host: 'api.ipify.org' } } }
{ response:
{ debugId: 1,
headers:
{ server: 'Cowboy',
connection: 'close',
'access-control-allow-origin': '*',
'content-type': 'application/json',
date: 'Sat, 28 Oct 2017 07:29:48 GMT',
'content-length': '24',
via: '1.1 vegur' },
statusCode: 200,
body: '{"ip":"x.x.x.x"}' } }
{ name: 'User',
email: 'someuser@gmail.com',
accountType: 'publisher', }
{ request:
{ debugId: 2,
uri: 'https://google.com/',
method: 'GET',
headers:
{ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
Host: 'www.google.com',
Origin: 'https://www.google.com',
'Accept-Language': 'en-US,en;q=0.5',
Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' } } }
这个错误几乎可以在我尝试的时候重现。
我在多台服务器上测试了这段代码,抛出了同样的错误。
如果在此情况下向google.com
发送请求之前设置了延迟,则可以正常工作。
有趣的是,我的API可以同时处理许多其他请求,但只有这种情况会导致错误。
在系统更新之前,此工作正常。我试图运行npm update
,但这并没有解决问题。
此外,我尝试设置
的全局设置var http = require('http');
http.globalAgent.maxSockets = Infinity;
它也没有用。
请帮助解决这个问题,在发送第二个请求之前总是很奇怪并且延迟一直没有工作,有时它只是等待更长时间并且最终会出现同样的错误。
如果有任何帮助或建议,我将不胜感激。