控制请求流而不丢弃它们 - NodeJS
Controlling the flow of requests without dropping them - NodeJS
我有一个简单的 nodejs 网络服务器 运行,它:
- 接受请求
- 产生单独的线程来执行后台处理
- 后台线程returns 结果
- 应用响应客户端
使用 Apache 基准测试 "ab -r -n 100 -c 10",执行 100 个请求,一次执行 10 个请求。
平均响应时间为 5.6 秒。
我使用 nodejs 的逻辑是,它通常非常节省资源,尤其是当大部分工作由另一个进程完成时。似乎是这种情况下最轻量级的网络服务器选项。
问题
有 10 个并发请求时,我的 CPU 已经用完了,这并不奇怪,因为后台有 CPU 密集的工作。
水平扩展是一件容易的事,尽管出于显而易见的原因我想充分利用每台服务器。
那么如何使用 nodejs,无论是原始的还是一些框架,如何控制它,以免在 CPU.
上过度杀伤
潜在方法?
能否接受将其存储在数据库或某些持久存储中并具有使用异步库一次处理 x 的单独进程的请求?
在您的潜在方法中,您基本上是在描述一个队列。您可以将传入的消息(作业)存储在那里,并让每个进程一次获得一个作业,只有在处理完上一个作业后才获得下一个作业。您可以生成多个并行工作的进程,数量等于系统中的核心数。产生更多对性能没有帮助,因为多个进程共享一个核心只会 运行 变慢。保持一个核心空闲可能是让系统响应管理任务的首选。
存在许多不同的队列。似乎得到很好支持的基于节点的使用 redis 进行持久化的是 Kue (I have no personal experience using it). I found a tutorial for building an implementation with Kue here。不过,根据您的环境所使用的软件 运行,另一种选择可能更有意义。
祝你好运,玩得开心!
我有一个简单的 nodejs 网络服务器 运行,它:
- 接受请求
- 产生单独的线程来执行后台处理
- 后台线程returns 结果
- 应用响应客户端
使用 Apache 基准测试 "ab -r -n 100 -c 10",执行 100 个请求,一次执行 10 个请求。
平均响应时间为 5.6 秒。
我使用 nodejs 的逻辑是,它通常非常节省资源,尤其是当大部分工作由另一个进程完成时。似乎是这种情况下最轻量级的网络服务器选项。
问题
有 10 个并发请求时,我的 CPU 已经用完了,这并不奇怪,因为后台有 CPU 密集的工作。
水平扩展是一件容易的事,尽管出于显而易见的原因我想充分利用每台服务器。
那么如何使用 nodejs,无论是原始的还是一些框架,如何控制它,以免在 CPU.
上过度杀伤潜在方法?
能否接受将其存储在数据库或某些持久存储中并具有使用异步库一次处理 x 的单独进程的请求?
在您的潜在方法中,您基本上是在描述一个队列。您可以将传入的消息(作业)存储在那里,并让每个进程一次获得一个作业,只有在处理完上一个作业后才获得下一个作业。您可以生成多个并行工作的进程,数量等于系统中的核心数。产生更多对性能没有帮助,因为多个进程共享一个核心只会 运行 变慢。保持一个核心空闲可能是让系统响应管理任务的首选。
存在许多不同的队列。似乎得到很好支持的基于节点的使用 redis 进行持久化的是 Kue (I have no personal experience using it). I found a tutorial for building an implementation with Kue here。不过,根据您的环境所使用的软件 运行,另一种选择可能更有意义。
祝你好运,玩得开心!