[eggjs/egg]egg 迁移到阿里云函数计算,使用post方式发送请求,第一个请求正常,相隔10秒后发第二个请求,egg崩溃

2024-08-05 664 views
2

非常神奇的问题,阿里云函数计算的售后技术也想不通,反复测试也解决不了

post方式异常,get方式发送请求正常 express 迁移正常

函数计算测试链接:http://26446217-1866482459017639.test.functioncompute.com/ 有兴趣的,可以通过postman测试,上面的地址,任意路由,发送post请求,第一次显示403,因为没有设置post响应,等10秒再发送,egg崩溃,显示:"errorMessage": "Process exited unexpectedly before completing request (duration: 8ms, maxMemoryUsage: 166.19MB)"

回答

5

看 common-error 日志

3

阿里云函数计算自带的日志服务和common-error,都没有记录相关日志,只记录了一条日志: FC Invoke End RequestId: a6a416d6-ec49-4776-84ed-fb5f744b5769, Error: Process exited unexpectedly before completing request (duration: 1760ms, maxMemoryUsage: 113.43MB)

4

egg 默认会往磁盘写日志的,估计函数计算需要配置下对应的处理,或者用 egg-logger-sls 之类的方式把日志转存

2

我做了处理的,日志能够成功写入的,我是在node.js的入口函数那里加的日志,就是koa源码,http.createServer() 这里,也就是请求处理的源头处。但是只有get操作能看到日志。异常的post操作,没有看到日志,也就是连这个入口都没进入。

函数计算的售后技术有一个推测是keep-alive的问题,但是也解决不了。

4

我指的是看 common-error 日志才知道为啥进程挂了,这块日志你不导出来我们隔空交流也没办法。

fc 这种模式跟 web 应用是有区别的,需要去用它的 custom runtime 等方式来适配。

6

common-error 日志是有的,并且能够实时写入,如果需要也可以导给你看。

我指的是当发生异常的时候,日志里没有任何记录。

我自己分析,大概率是函数计算把keep-alive的响应头给屏蔽掉了,我看了egg源码,默认是加上了keep-alive的,egg服务放在其他地方测试,能够看到keep-alive响应头,但是放到函数计算里,keep-alive响应头消失了,导致请求econnect,导致根本没有进入egg,自然也就没有任何日志。

8

看下日志,如果 egg 这边没有内部错误,也没有主动退出。然后按你的描述是请求没进来,那这就要 FC 的人查了,也可以在 egg 的 coreMiddleware 最前面插个中间件打下日志确认下是不是没进来。

3

可以确定,发生错误时,没有记录任何日志的。我已经找了阿里云FC,提了2个工单,加了钉钉,也解决不了,不知道怎么办了。

我又仔细看了函数计算的文档,明确说了不支持keep-alive,我再想想其他办法,下面是函数计算官方文档:

使用限制 函数设置HTTP触发器后不能设置其他类型触发器。 每个函数只能创建一个HTTP触发器。 若您使用了版本管理功能,每个函数对应的版本或别名只能创建一个HTTP触发器。即一个函数的一个版本或一个别名对应可以创建一个HTTP触发器。版本和别名的详细信息请参见版本简介。 Request Headers key中包含以下字段会被忽略,不支持用户自定义。另外,以x-fc-开头的Key也不支持自定义。 accept-encoding connection keep-alive proxy-authorization te trailer transfer-encoding Response Headers key中包含以下字段会被忽略,不支持自定义。另外,以x-fc-开头的Key也不支持自定义。 connection content-length content-encoding date keep-alive proxy-authenticate server trailer transfer-encoding upgrade content-disposition:attachment

2

@i5ting

1

感谢 atian25 热心回答,自己解决了,答案在下面,让其他掉坑的同学早点出来吧。阿里的售后和发帖子看来不在一个团队,所以虽然已经有了解决方案,但售后不知道。

阿里云自己的贴子,关于custom runtime,已经做了说明,https://developer.aliyun.com/article/728321

原理:http server 的实现 connection keep alive, request timeout 至少10分钟以上 关键代码: server.timeout = 0; // never timeout server.keepAliveTimeout = 0; // keepalive, never timeout

3

请问egg如何设置timeout和keepAliveTimeout呢?官方文档没查到。