Node.js 在不丢弃请求的情况下控制请求流-NodeJS

Node.js 在不丢弃请求的情况下控制请求流-NodeJS,node.js,multithreading,Node.js,Multithreading,我有一个简单的nodejs Web服务器正在运行,它: 接受请求 生成单独的线程以执行后台处理 后台线程返回结果 应用程序响应客户端 使用Apache基准测试“ab-r-n100-c10”,一次执行100个请求,每次执行10个请求 平均响应时间为5.6秒 我使用nodejs的逻辑是,它通常非常节省资源,特别是当大部分工作由另一个进程完成时。似乎是这个场景中最轻量级的Web服务器选项 问题 由于有10个并发请求,我的CPU已经耗尽,这并不奇怪,因为后台正在进行CPU密集型工作 横向扩展是一件容易做

我有一个简单的nodejs Web服务器正在运行,它:

  • 接受请求
  • 生成单独的线程以执行后台处理
  • 后台线程返回结果
  • 应用程序响应客户端
  • 使用Apache基准测试“ab-r-n100-c10”,一次执行100个请求,每次执行10个请求

    平均响应时间为5.6秒

    我使用nodejs的逻辑是,它通常非常节省资源,特别是当大部分工作由另一个进程完成时。似乎是这个场景中最轻量级的Web服务器选项

    问题

    由于有10个并发请求,我的CPU已经耗尽,这并不奇怪,因为后台正在进行CPU密集型工作

    横向扩展是一件容易做到的事情,尽管出于显而易见的原因,我想充分利用每台服务器

    因此,如何使用nodejs,无论是原始的还是某些框架,如何控制它,以避免在CPU上过度消耗

    潜在方法?


    是否可以接受请求,将其存储在db或某个持久性存储器中,并拥有一个单独的进程,该进程使用异步库一次处理x?

    在您可能的方法中,您基本上描述的是一个队列。您可以将传入消息(作业)存储在那里,并让每个进程一次获取一个作业,只有在处理上一个作业完成后才能获取下一个作业。您可以生成多个并行工作的进程,其数量等于系统中的内核数量。产生更多的内存不会有助于提高性能,因为共享一个核心的多个进程只会运行得更慢。保持一个内核空闲可能会使系统对管理任务保持响应

    存在许多不同的队列。一个使用redis进行持久化的基于节点的系统似乎得到了很好的支持(我个人没有使用它的经验)。我找到了一个使用Kue构建实现的教程。不过,根据您的环境运行的软件,另一种选择可能更有意义


    祝你好运,玩得开心

    消息队列听起来是这里最好的方式,谢谢!