node.js - 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 应用程序永远不会收到响应,即使它是由外部服务返回的。似乎连接在节点应用程序和外部服务之间的某个地方断开了。
我试过使用:
- request.js 的
forever: true
选项 - 设置 keepAlive 代理
它没有帮助。如果我不使用该timeout
选项,我的节点应用程序将永远运行。何时timeout
设置并超过我得到ESOCKETTIMEDOUT
错误。
有趣的是:
- 相同的代码在我的本地机器上运行良好
- 它在 NAT 后面工作的 Linux 虚拟机上也能正常工作
- 当我使用 CURL 重复请求时,在 Kubernetes 机器上工作正常
Kubernetes 是否有可能断开我的连接?为什么?CURL 如何设置 keepalive 设置以及为什么 CURL 请求可以从 Kubernetes 工作?
PS。而不是request.js,我尝试使用其他库,如node-fetch或axios但结果是相同的。
解决方案
推荐阅读
- vba - Outlook 创建新电子邮件并使用 vba 查找 csv 文件
- php - 如何在 localhost 中运行 symfony 项目
- swiftui - swiftUI NavigationLink 没有带我到正确的视图
- javascript - 使用纯 JS 实现多层次的 JavaScript 拖放
- python-3.x - Pipenv 无法创建虚拟环境(Windows)
- floating-point - test-js:科学软件:有效数字
- sql - “可选”参数的输入参数验证
- jsonpath - 按 JSONPath 中键的值过滤 json
- ios - 如何将 Observable 的值转换为协议类型
- openldap - LDAP,匿名身份验证