首页 > 解决方案 > Kubernetes 丢弃在 node.js 中初始化的长 HTTP GET 连接

问题描述

我有一段非常简单的用 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 代理

它没有帮助。如果我不使用该timeout选项,我的节点应用程序将永远运行。何时timeout设置并超过我得到ESOCKETTIMEDOUT错误。

有趣的是:

Kubernetes 是否有可能断开我的连接?为什么?CURL 如何设置 keepalive 设置以及为什么 CURL 请求可以从 Kubernetes 工作?

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

标签: node.jskubernetesgoogle-cloud-platformhttp-getrequestjs

解决方案


推荐阅读