术业专攻 | 如何让Java Web性能翻倍?
Posted 恒拓开源
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了术业专攻 | 如何让Java Web性能翻倍?相关的知识,希望对你有一定的参考价值。
如何让Java Web 的性能翻倍???答曰——
响应式编程
响应式编程说来话长,概念也比较晦涩难懂,画风也与我们常用的命令式编程不一样。说清它的来龙去脉并不是小编今天的重点,我们只需要知道它是关于构建异步、事件驱动的非阻塞I/O应用即可。
要说明的是,此响应式(Reactive)非彼响应式(Responsive)。
虽然小编认为应该翻译为“反应式”。不过国内已翻译为“响应式”了,为避免混淆,本文也采用相同的术语。你知道本文说的不是H5那个响应式,就可以了。
Spring WebFlux
Spring框架从5.0开始拥抱ReactiveStreams规范,这个规范亦被Java9吸纳为java.util.concurrent.Flow。而Spring WebFlux则是Spring团队推出的基于响应式编程模型的Web框架。
性能测试
接下来我们通过测试,看看spring-webflux框架相对于自家的spring-webmvc,在性能上有什么差异。
我们测试以下3个框架:
1.spring-webmvc
2.spring-webflux
3.node.js + koa2(用以性能著称的Node.js做参考)
三个框架均提供一个HTTP接口,直接返回“Hello World”字符串。
另外,JVM与Node均不作性能调优。
硬件方面,使用两台网络直通的DigitalOcean云主机两台:
主机 |
配置 |
角色 |
benchmark-01 |
2U / 2GB |
受压服务器 |
benchmark-02 |
1U / 1GB |
压力源服务器 |
压测使用wrk,并发数从100开始,每次递增100,直至1000。每个框架采样6次,取平均值。
由于我们着重考虑高并发下的性能,限于篇幅,我们对比在1000并发下,3个框架的性能指标:
框架 |
CPU占用率 |
内存使用 |
线程数 |
平均QPS |
备注 |
spring-webmvc |
198% |
380M |
2115 |
6621 |
|
spring-webflux |
198% |
390M |
19 |
13112 |
|
koa2 |
198% |
200M |
12 |
13832 |
使用PM2启动2个实例,以充分利用多核 |
可以看出,在同等用例下,spring-webflux有相对于spring-webmvc两倍的QPS,能够达到与Node差不多的性能。
我们都知道,越多的线程意味着越多的CPU上下文切换消耗。在1000并发下,spring-webflux仅需19个线程,而spring-webmvc则需要使用2000多个线程。从结果来看,3个case的CPU均跑满,因此服务器的瓶颈为CPU,可以推测,在多核多CPU的服务器下,性能差距会进一步加大。
另外,这只是纯框架层面的测试,响应式的优势在I/O密集、复杂业务场景,在这类场景下优势会更为明显。
总结
spring-webflux还处于Milestone阶段,在性能上的提升已经足够诱人。况且响应式编程模型还纳入了Java 9的API,有构建高并发应用,而又希望继续使用统一的Java技术栈的团队,可以持续关注。
以上是关于术业专攻 | 如何让Java Web性能翻倍?的主要内容,如果未能解决你的问题,请参考以下文章