最近在阿里云函数计算中,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 | config.httpclient = { |
可在 HttpClient 默认全局配置、github -> config.default.js -> httpclient 中查看文档。
注意
HttpClient 是发送 HTTP 请求的,而 timeout 和 keepAliveTimeout 是要设置到 egg 启动的 http server 上。
¶2.2 config.clusterClient 无效
修改/config/config.default.js
文件:
1 | config.clusterClient = { |
可在 在框架里面 cluster-client 相关的配置项、github -> config.default.js -> clusterClient 中查看文档。
¶2.3 app.server 推荐
APP 的生命周期函数中提供了serverDidReady
方法,此时可以从app.server
拿到 server 的实例。文档:启动自定义。拿到 server 实例我们就可以设置 timeout 和 keepAliveTimeout。
根目录增加app.js
文件,代码如下:
1 | class AppBootHook { |
¶参考文章
[1] egg Issue #4541 - egg 如此设置 keepAliveTimeout 超时时间不不起作用?
[2] egg Issue #4411 - egg 迁移到阿里云函数计算,使用post方式发送请求,第一个请求正常,相隔10秒后发第二个请求,egg崩溃