Kubernetes删除了在node.js中初始化的长HTTP GET连接

时间:2018-05-14 13:36:48

标签: node.js kubernetes google-cloud-platform http-get requestjs

我有一段用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应用程序永远不会收到响应,即使它是由外部服务返回的。似乎连接被丢弃在节点应用程序和外部服务之间。

我试图使用:

  1. request.js' forever: true选项
  2. 设置keepAlive代理
  3. 没有用。如果我不使用timeout选项,我的节点应用程序将永远运行。如果设置并超出timeout,则会出现ESOCKETTIMEDOUT错误。

    有趣的是:

    • 相同的代码在我的本地计算机上运行得非常好
    • 它也适用于在NAT后面工作的Linux虚拟机
    • 当我使用CURL 重复请求时,
    • 从Kubernetes机器正常工作

    Kubernetes是否可以放弃我的联系?为什么? CURL如何设置keepalive设置以及为什么CURL请求可以从Kubernetes工作?

    PS。我尝试使用 node-fetch axios 之类的其他库,而不是 request.js ,但结果是相同的。

0 个答案:

没有答案