[eggjs/egg]hi,我目前在使用 egg 多进程结构做后端服务支持,有这样一个问题想要请教

2025-10-27 841 views
2

需求: 上传exl文件,然后对文件的内容进行校验

问题: 在文件上传到服务器临时文件夹后,我会用 app.messenger.sendToAgent(...) 通知 agent 启动一个随机的 worker 来异步处理文件校验,然后结束这次请求。 因为文件数据量比较大,校验属于同步任务,会导致 CPU 使用率长时间接近 100%,这时候,如果有其他请求接入,会导致响应非常慢(可以正常收到请求)

思路: 想知道,有没有什么方法可以手动设置当前 worker 的 CPU 用量,维持在一个正常水平,不要影响服务器响应其他请求,或者这种场景有什么其他的好的解决思路么?想请教一下

回答

6

我是如何验证校验过程中,服务器可以正常接收其他请求的: 在一个自定义 middleware 中打印每个请求分配的 pid,结果显示都可以正常打印,但是前端无法正常响应,status 一直是 pendding

1

app worker 还是 agent worker 的的 cpu 使用率会达到 100%

按理来说 agent 只负责启动一个子进程处理文件的话,不会影响到 agent worker 和 app worker 自身的

4

app worker

app worker 还是 agent worker 的的 cpu 使用率会达到 100%

按理来说 agent 只负责启动一个子进程处理文件的话,不会影响到 agent worker 和 app worker 自身的

app-worker

9

那么也就是说,你通知的是 app worker 去处理大文件咯?

3

那么也就是说,你通知的是 app worker 去处理大文件咯?

是的,我的工作流程是,处理当前请求的 worker 先通知 agent,然后再 agent 中 sendRandom 随机分配一个 worker 来处理大文件任务

7

CPU 密集型业务,需引入 阿里云函数计算 ,可以看下对应的文档。

egg 是 web 服务,它应该把这类的任务发给 函数计算 来做

0

明白你的场景了

有没有什么方法可以手动设置当前 worker 的 CPU 用量,维持在一个正常水平,不要影响服务器响应其他请求

这个是没办法控制的,一个思路是你不要直接用 app worker 去处理大文件,而是让 app worker 再 spawn 一个子进程出来处理,然后拿结果返回

要不然一定会影响到你的业务请求。

8

spawn 也没用,CPU 密集型的业务,肯定会抢占同机的其他进程的。

6

spawn 的方案我也试过,CPU还是会飙升

3

处理任务期间,整个服务响应会很慢,几乎会被阻塞的状态

6

spwan + 更多的 cpu 核心数,要么就是把大文件处理单独抽象成一个内部服务,通过消息队列的方式和你的业务间同步处理数据

0

好的,我看一下文档

8

等于单独部署一套计算服务来做这个大文件处理咯?

0

嗯,因为 nodejs 这种单进程模型,本来就不能把长期占据 cpu 的任务放到 event loop 里,必然会阻塞,其实换成别的语言,也不会放到 main thread 里做的,都是开个线程搞

而如果你的机器本身核心数不多,开线程做一样会因为机器级别的挤占导致业务请求受影响。

所以要自己搞得话,就是单独开个服务

1

好的感谢,大概知道思路了,我去试一下

4

那先关闭了,有问题可以再开

4

真没必要独立部署,看下阿里云函数计算的文档吧,免费额度也不少。

4

感谢老哥,昨晚已经看了文档,这周实践一下,肯定是选最快最方便的方案

1

好的,感谢帮助