提高Node JS服务器应用程序吞吐量的步骤

时间:2017-06-27 06:04:30

标签: node.js nginx throughput node-cluster

我有一个非常简单的nodejs应用程序,它通过POST请求体接受json数据(大约1KB)。响应立即发送回客户端,json以异步方式发布到Apache Kafka队列。同时请求的数量可以高达每秒10000个,我们使用在三台不同机器上运行的Apache Jmeter进行模拟。目标是在没有失败的请求的情况下实现不到一秒的平均吞吐量。

在4核计算机上,该应用程序每秒最多可处理4015个请求而不会出现任何故障。但是,由于目标是每秒10000个请求,我们在集群环境中部署了节点应用程序。

实现了同一台机器中的群集和两台不同机器之间的群集(如here所述)。 Nginx用作负载均衡器来循环两个节点实例之间的传入请求。我们预计吞吐量会有显着提高(如记录here),但结果恰恰相反。 成功请求的数量降至每秒3100个请求。

我的问题是:

  1. 群集方法可能出现什么问题?
  2. 这是增加Node应用程序吞吐量的正确方法吗?
  3. 我们还在Tomcat容器中使用java Web应用程序进行了类似的练习,并按预期执行了4000个请求 单个实例和群集中大约5000个成功请求 有两个实例。这与我们的信念相矛盾 nodejs比Tomcat表现更好。 tomcat一般都比较好 因为每个请求模型的线程?
  4. 提前多多感谢。

2 个答案:

答案 0 :(得分:2)

根据您的要求,我会将我的评论写入答案:

群集通常是正确的方法,但它是否有帮助取决于您的瓶颈所在。你需要做一些测量和一些实验来确定。如果您受CPU限制并在多核计算机上运行,​​那么群集应该会有很大帮助。我想知道你的瓶颈是否是CPU以外的东西,比如网络或其他共享I / O甚至是Nginx?如果是这种情况,那么在看到群集的好处之前,您需要先解决这个问题。

  

由于每个请求模型的线程,tomcat通常更好吗?

没有。这不是一个很好的概括。如果您受CPU约束,那么线程可以提供帮助(因此可以使用nodejs进行聚类)。但是,如果您受I / O限制,那么线程通常比像nodejs这样的异步I / O更昂贵,因为线程本身的资源开销和线程之间上下文切换的开销。许多应用程序都受I / O限制,这是node.js成为服务器设计的一个很好选择的原因之一。

  

我忘了提到对于http,我们使用express而不是节点提供的本机http。希望它不会给请求处理带来开销吗?

Express非常有效,不应成为您任何问题的根源。

答案 1 :(得分:1)

正如jfriend所说,你需要找到瓶颈, 你可以尝试的一件事是通过使用套接字来传递json,特别是这个库https://github.com/uNetworking/uWebSockets来减少带宽/吞吐量。 主要原因是http请求比套接字连接重得多。

好例子:https://webcheerz.com/one-million-requests-per-second-node-js/

最后你也可以通过(http gzip)或第三方模块压缩json。

处理重量^^

希望它有所帮助!