我有一个非常简单的nodejs应用程序,它通过POST请求体接受json数据(大约1KB)。响应立即发送回客户端,json以异步方式发布到Apache Kafka队列。同时请求的数量可以高达每秒10000个,我们使用在三台不同机器上运行的Apache Jmeter进行模拟。目标是在没有失败的请求的情况下实现不到一秒的平均吞吐量。
在4核计算机上,该应用程序每秒最多可处理4015个请求而不会出现任何故障。但是,由于目标是每秒10000个请求,我们在集群环境中部署了节点应用程序。
实现了同一台机器中的群集和两台不同机器之间的群集(如here所述)。 Nginx用作负载均衡器来循环两个节点实例之间的传入请求。我们预计吞吐量会有显着提高(如记录here),但结果恰恰相反。 成功请求的数量降至每秒3100个请求。
我的问题是:
提前多多感谢。
答案 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。
处理重量^^
希望它有所帮助!