NodeJS 处理express请求的多线程范例

vfh0ocws  于 2023-04-20  发布在  Node.js
关注(0)|答案(1)|浏览(429)

现在我下面的要求有些人可能会觉得奇怪,但我有我的理由,所以请原谅我。
我正在使用node.js与express,它的默认行为是使用单线程并发服务请求,在大多数情况下都很好..但不是我的,所以问,是否有任何express的库/中间件将使用工作线程概念并为每个线程服务1个请求?(旧的做事方式)
原因:我的请求处理包括两件事,主要是与Redis/SSD(IO绑定1秒)交谈,然后做CRC,Unzip,Zip(计算绑定4秒)问题是当并行度很高时,节点异步单线程方法开始延长请求时间,因为更多的并行请求开始击中服务器,从而使响应时间不可预测或超时(也是同步工作的循环饱和原因),所以这个问题。
我尝试过的:1)集群模式应该有相同的效果像线程唯一的缺点是“内存”消耗,我有应用程序级别的进程缓存在集群模式下所有集群子进程有它的理想副本,从而拍摄了mem req.. 2)Piscina,它提供了一些类似的下一个框架,但不确定,因为我使用的是express..
所以最后的要求很简单,我们已经实现了如何使用单线程异步操作来获取设置数据库类型的rest服务..我要求相反的实现或处理请求的老派方式。

mu0hgdu0

mu0hgdu01#

Nodejs集群是一种预构建的方式,在处理Express请求时涉及多个CPU。我不知道nodejs/Express的其他预构建机制。
你提到过你认为这会占用太多内存,但是nodejs线程并不会有更高的内存效率,因为它们会为每个线程自己启动一个单独的VM解释器。如果你有特定的内存需求,那么请分享它。
从你所描述的,CRC和压缩是CPU绑定的部分。I/O的东西可能会在主线程中工作得很好,因为它是非阻塞的,不受CPU的限制。
因此,您可以创建一个由多个线程处理的作业队列,然后将压缩和CRC工作馈送到作业队列。这将使您的主Web服务器线程空闲并响应其他请求,同时使用多个CPU进行CPU密集型工作。主线程将请求放入队列中,每个工作线程将抓取一个作业,对其进行处理。将结果返回给主线程,主线程可以发送响应,然后工作线程将从作业队列中抓取下一个项目。编写自己的队列并不需要太多代码(我自己已经编写了几个),或者有许多第三方库提供具有各种功能的队列。
通常情况下,我编写的worker只对发送给它们的作业做出响应。队列知道worker,每当它获得新作业时,它会检查是否有空闲的worker。如果有,它会将新作业发送给它。如果没有,它会将作业添加到队列中,并等待现有的worker完成它正在处理的作业。

相关问题