我有一段用node.js编写的非常简单的代码(见下面的例子),它运行在GCP和AWS上的Kubernetes上。该应用程序只是执行GET请求从外部应用程序导入数据。有时,GET请求可能需要约30分钟或更长时间。
var http = require("http");
var request = require('request');
var options = {
url: "my-external-service",
gzip: true,
// (1) forever: true,
// (2) agent: new http.Agent({ keepAlive: true })
};
request.get(options, (error, response, body) => {
console.log('error:', error);
console.log('statusCode:', response && response.statusCode);
console.log('body:', body);
});
问题是我的node.js应用程序永远不会收到响应,即使它是由外部服务返回的。似乎连接被丢弃在节点应用程序和外部服务之间。
我试图使用:
forever: true
选项没有用。如果我不使用timeout
选项,我的节点应用程序将永远运行。如果设置并超出timeout
,则会出现ESOCKETTIMEDOUT
错误。
有趣的是:
Kubernetes是否可以放弃我的联系?为什么? CURL如何设置keepalive设置以及为什么CURL请求可以从Kubernetes工作?
PS。我尝试使用 node-fetch 或 axios 之类的其他库,而不是 request.js ,但结果是相同的。