RPC 协议 Triple 和 Dubbo 基准测试

  • Dubbo3 的 Dubbo 协议 实现,在性能方面与 Dubbo2 版本基本相同。
  • 由于 _Triple 协议_ 本身是基于 HTTP/2 构建的,因此在单链接上的 RPC 调用相对于基于 TCP 的 Dubbo2 并没有提升,在部分调用场景下反而有一定的下降。但 _Triple 协议_ 更大的优势在于网关穿透性、通用性以及 Stream 通信模型带来的整体吞吐量提升。
  • 预计 Triple 在网关代理场景下会有更好的性能表现。鉴于目前的压力测试环境,本轮基准测试暂未提供。

1.1 环境

| | 说明 | | ———— | ———————————— ———————— | | 机器 | 4 核 8G Linux JDK 1.8 (提供者) 4 核 8G Linux JDK 1.8 (消费者) | | 压力测试用例 | RPC 方法类型包括:无参数无返回值、普通 POJO 返回值、POJO 列表返回值

2.7 版本 Dubbo 协议 (Hessian2 序列化)
3.0 版本 Dubbo 协议 (Hessian2 序列化)
3.0 版本 Dubbo 协议 (Protobuf 序列化)
3.0 版本 Triple 协议 (Protobuf 序列化)
3.0 版本 Triple 协议 (Protobuf 设置 Hessian2 序列化) | | 压力测试方法 | 单链接场景下,消费者启动 32 个并发线程(当前机器配置下 qps rt 较为均衡的并发数),持续压测后采集压测数据
压力测试数据通过 https: //github.com/apache/dubbo-benchmark 获取 |


1.2 数据分析

| | Dubbo + Hessian2
2.7
| Dubbo + Hessian2
3.0
| Dubbo + Protobuf
3.0
| Triple + Protobuf
3.0
| Triple + Protobuf(Hessian)
3.0
| | —————— | —————————– | —————————– | ——————– ——— | —————————— | ——— ——————————— | | 无参数方法 | 30333 ops/s
2.5ms P99 | 30414 ops/s
2.4ms P99 | 24123 ops/s
3.2ms P99 | 7016 ops/s
8.7ms P99 | 6635 ops/s
9.1ms P99 | | POJO 返回值 | 8984 ops/s
6.1 ms P99 | 12279 ops/s
5.7 ms P99 | 21479 ops/s
3.0 ms P99 | 6255 ops/s
8.9 ms P99 | 6491 ops/s
10 ms P99 | | POJO 列表返回值 | 1916 ops/s
34 ms P99 | 2037 ops/s
34 ms P99 | 12722 ops/s
7.7 ms P99 | 6920 ops/s
9.6 ms P99 | 2833 ops/s
27 ms P99 |

1.2.1 不同版本 Dubbo 协议的比较

//imgs/v3/performance/rpc-dubbo.svg


图 3 不同版本 Dubbo 协议实现的比较

  • 就 Dubbo RPC + Hessian 的默认组合而言,Dubbo3 和 Dubbo2 在不同的调用场景下性能基本持平

1.2.2 Dubbo 协议与 Triple 协议的比较

//imgs/v3/performance/rpc-triple.svg


图 4 Triple 与 Dubbo 的比较

  • 单纯从 Consumer <-> Provider 点对点调用来看,Triple 协议本身并不占优势。同样采用 Protobuf 序列化方式,Dubbo RPC 协议整体性能依然优于 Triple。

  • Triple 实现将在 3.0 版本中持续优化,但无法彻底改变“基于 HTTP/2 的 RPC 协议”在部分场景下相对于“基于 TCP 的 RPC 协议”处于劣势的局面

1.2.3 补充网关场景

待定

1.2.4 模拟 Stream 通信场景的吞吐量提升

待定


上次修改时间:2023 年 1 月 2 日: 增强英文文档 (#1798) (95a9f4f6c1c)