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

Steps to improve throughput of Node JS server application

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

在 4 核机器上,应用程序每秒处理多达 4015 个请求而没有任何失败。但是由于目标是每秒 10000 个请求,我们将节点应用程序部署在集群环境中。

在同一台机器上进行集群,在两台不同机器之间进行集群(如here) were implemented. Nginx was used as a load balancer to round robin the incoming requests between the two node instances. We expected a significant improvement in the throughput (like documented here所述),但结果恰恰相反。 成功请求数下降到每秒 3100 次左右。

我的问题是:

  1. 集群方法可能出了什么问题?
  2. 这是增加 Node 应用程序吞吐量的正确方法吗?
  3. 我们还对 Tomcat 容器中的 java Web 应用程序进行了类似的练习,它按预期执行了 4000 个请求 集群中的单个实例和大约 5000 个成功请求 有两个实例。这与我们的信念相矛盾 nodejs 的性能优于 Tomcat。 tomcat 通常更好吗 因为它的每个请求模型的线程?

非常感谢。

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

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

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

努力减肥^^

希望对您有所帮助!

根据你的要求,我会把我的评论写成答案:

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

Is tomcat generally better because of its thread per request model?

没有。这不是一个很好的概括。如果您是 CPU-bound,那么线程可以提供帮助(使用 nodejs 进行集群也可以)。但是,如果你是 I/O 绑定的,那么由于线程本身的资源开销和线程之间上下文切换的开销,线程通常比 nodejs 的异步 I/O 更昂贵。许多应用程序是 I/O 绑定的,这是 node.js 可以成为服务器设计的一个很好的选择的原因之一。

I forgot to mention that for http, we are using express instead of the native http provided by node. Hope it does not introduce an overhead to the request handling?

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