2

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

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

实现了同一台机器上的集群和两台不同机器之间的集群(如此处所述。Nginx 被用作负载均衡器,以轮询两个节点实例之间的传入请求。我们预计吞吐量会显着提高(如此所述),但结果恰恰相反。成功请求的数量下降到每秒大约 3100 个请求。

我的问题是:

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

提前非常感谢。

4

2 回答 2

2

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

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

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

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

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

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

于 2017-06-28T15:03:58.497 回答
1

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

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

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

努力减肥^^

希望能帮助到你!

于 2017-06-27T06:41:13.247 回答