egg 设置 keepAliveTimeout 超时时间

  最近在阿里云函数计算中,Post 接口经常在紧密相邻的第二次调用时报错,{ errorMessage: 'Process exited unexpectedly before completing request (duration: 1ms, maxMemoryUsage: 200.52MB) },这个错误经过测试是偶发必现的,比较影响体验,记录下解决方法。

一、出现错误

  这个项目在函数计算的部署环境是Custom Runtime,选用了egg框架。调用一个 Post 接口的时候,发现经常性的没有反应,查看日志后发现偶发遇到502 bad gateway的错误。查看函数计算的文档后发现有以下要求:

HTTP Server 配置要求
Connection 需要设置为 Keep-Alive,Server 端请求超时时间需设置在15分钟及以上。示例如下:

1
2
3
4
//例如Node.js使用express时
var server = app.listen(PORT, HOST)
server.timeout = 0 // never timeout
server.keepAliveTimeout = 0 // keepalive, never timeout

二、解决方法

  从网上找到三种解决方法,下述前两种尝试后发现没有效果,错误依旧可复现。

2.1 config.httpclient 无效

  修改/config/config.default.js文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
config.httpclient = {
request: {
// 默认 request 超时时间
timeout: 60000
},

httpAgent: {
// 默认开启 http KeepAlive 功能
keepAlive: true,
// 空闲的 KeepAlive socket 最长可以存活 4 秒
freeSocketTimeout: 0,
// 当 socket 超过 30 秒都没有任何活动,就会被当作超时处理掉
timeout: 0,
// 允许创建的最大 socket 数
maxSockets: Number.MAX_SAFE_INTEGER,
// 最大空闲 socket 数
maxFreeSockets: 256
},

httpsAgent: {
keepAlive: true,
freeSocketTimeout: 0,
timeout: 0,
maxSockets: Number.MAX_SAFE_INTEGER,
maxFreeSockets: 256
}
}

  可在 HttpClient 默认全局配置github -> config.default.js -> httpclient 中查看文档。

注意
HttpClient 是发送 HTTP 请求的,而 timeout 和 keepAliveTimeout 是要设置到 egg 启动的 http server 上。

2.2 config.clusterClient 无效

  修改/config/config.default.js文件:

1
2
3
4
config.clusterClient = {
maxWaitTime: 60000,
responseTimeout: 60000
}

  可在 在框架里面 cluster-client 相关的配置项github -> config.default.js -> clusterClient 中查看文档。

2.3 app.server 推荐

  APP 的生命周期函数中提供了serverDidReady方法,此时可以从app.server拿到 server 的实例。文档:启动自定义。拿到 server 实例我们就可以设置 timeout 和 keepAliveTimeout。

  根目录增加app.js文件,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
class AppBootHook {
constructor(app) {
this.app = app
}
async serverDidReady() {
// http / https server 已启动,开始接受外部请求
// 此时可以从 app.server 拿到 server 的实例
this.app.server.timeout = 0
this.app.server.keepAliveTimeout = 0
}
}

module.exports = AppBootHook

参考文章

[1] egg Issue #4541 - egg 如此设置 keepAliveTimeout 超时时间不不起作用?
[2] egg Issue #4411 - egg 迁移到阿里云函数计算,使用post方式发送请求,第一个请求正常,相隔10秒后发第二个请求,egg崩溃

以上

随笔标题:egg 设置 keepAliveTimeout 超时时间

随笔作者:刘先玉

发布时间:2021年06月25日 - 23:19:19

最后更新:2021年06月25日 - 23:19:19

原文链接:https://liuxianyu.cn/article/egg-keepAlive-timeout.html