2017年9月发布的Spring Framework 5中,引入了Spring WebFlux。WebFlux是完全响应式的技术栈。2019年12月发布了Spring Data R2DBC,这是一个使用响应式的数据库驱动。在本文中,我将证明在高并发下,WebFlux和R2DBC表现更好。该组合的响应时间和吞吐量都更好。并且在处理每个请求时使用更少的内存和CPU,而且你的Fat JAR会变得更小。在高并发的时候,使用WebFlux和R2DBC(如果你不需要JPA的话)是个好主意。
测试方法
本文中,我们尝试了如下四种组合:
Spring Web MVC + JDBC 数据库驱动
Spring Web MVC + R2DBC 数据库驱动
Spring WebFlux + JDBC 数据库驱动
Spring WebFlux + R2DBC 数据库驱动
我已经将并行请求数以50个为单位从4增加到500,分别为负载生成器和服务分配4个核心(我的笔记本有12个核心)。我将所有的连接池都配置为100。为什么要固定核数和连接池的大小?因为在之前对JDBC和R2DBC的测试中,改变这些因素并没有提供更多的数据,所以我决定在这个测试中保持固定的变量,以减少测试需要运行的时间。
我在服务上模拟一个GET请求。该服务从数据库中获取了10条记录,并以JSON形式返回。首先,我对服务进行了2秒预热。接下来,我开始了1分钟的基准测试。我把每个场景运行5次(依次运行,而非5次之后再运行其他测试),并计算结果的平均值。我只统计了那些没有错误的测试。当我将并发数增加到1000以上时,所有的实现都无一例外地有失败。
我使用了Postgres(12.2)作为数据库。并且使用wrk来进行基准测试。我用下面的方法解析wrk的输出。主要测量: