控制请求流而不丢弃它们 - NodeJS

时间:2015-01-18 08:31:16

标签: node.js multithreading

我有一个简单的nodejs webserver运行,它:

  1. 接受请求
  2. 生成单独的线程以执行后台处理
  3. 后台线程返回结果
  4. 应用程序响应客户端
  5. 使用Apache基准测试“ab -r -n 100 -c 10”,一次执行100个请求,每次10个。

    平均响应时间为5.6秒。

    我使用nodejs的逻辑通常是资源效率非常高,特别是当大部分工作由另一个进程完成时。看起来像这个场景中最轻量级的网络服务器选项。

    问题

    有10个并发请求,我的CPU被最大化,这并不奇怪,因为后台有CPU密集型工作。

    横向缩放是一件容易的事情,虽然我希望从显而易见的原因中充分利用每台服务器。

    那么对于nodejs,无论是原始的还是一些框架,如何控制它以防止在CPU上过度使用。

    潜在方法?

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

1 个答案:

答案 0 :(得分:0)

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

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

祝你好运,玩得开心!