[eggjs/egg]egg进程假死,不处理任何请求

2024-07-22 439 views
2

egg还是可以处理请求,因为在第一个打印请求的中间件中有输出,但是后续都不再处理,没有一点响应,必须重启服务 image

Alinode 分析截图 image image

回答

2

进程没卡住,说明你后续中间件哪个异步任务卡住没响应了,诊断报告/CPU Profile 只能看 cpu 100% 的死循环导致的假死,你可以在业务逻辑多加几个日志看看是哪里的任务没反应

1

@hyj1991 你的意思是 cpu 不到 100% alinode 看不出任何问题吗?

mysql 我看也没有任何锁的情况,只能一个个打日志是吗

1

至少你抓的诊断报告和 CPU Profile 看不出有 JS 执行栈

3

@hyj1991 定位到问题了,是因为业务代码中 beginTransaction 了,但是因为业务处理不当,导致最终未 commit 或 rollback 直接 retrun 了;在 mysql 这个 npm 库中就造成了死循环,所有 query 语句都得不到执行。想请教下,有没办法改写 beginTransaction 达到不侵入和修改业务代码,让事务最终都结束。好像没有一个很好的时机

3

目前只能把一些业务中断原本是 return 的语句,改为 throw 任何值,触发 catch 的执行,catch 都统一 rollback 了

5

image

5

事务的 commit/ rollback 本来就是业务逻辑的一部分,所以最好就是把业务逻辑的地方修正。

你下面的这个写法其实是硬编码,等于在代码里继续埋了一个隐藏的雷,以后真有 transition 执行需要超过 10s 的会挂的莫名其妙更难排查 :)

6

是的 其实就是担心写业务的人 可能没有避免 导致 return 了,找到问题就行了,以后尽量多注意吧