公司内部的RPC框架,经过长时间的发展,已经由完全自研演进到底层替换为Dubbo实现,但使用方式(API)还是不变。由于使用了PB序列化协议,以及业务码+操作码定义接口的方式,非常影响开发效率,可理解性差,链路排查困难等问题,不断被业务方吐槽。因此就有了第三个版本,继续基于Dubbo扩展点,设计开发提供接近Dubbo原生的使用方式。

由于Dubbo原生提供的Http rpc协议的实现,不仅使用了Spring框架的API,还使用了Java的原生序列化,所以我们基于扩展点自实现了Http rpc协议,移除对Spring的强依赖,并使用json序列化协议。此次性能测试对比的是我们基于Dubbo扩展点自实现的Http rpc协议,与Dubbo原生Dubbo rpc协议的单次请求响应平均耗时、吞吐量。

  • Dubbo rpc:Dubbo rpc协议 + hessian2序列化协议

  • Http rpc:Http rpc协议(服务端使用jetty,客户端使用netty) + json序列化协议(使用fastjson)

基准测试目的

  • 在最初设计评审时,关于是采用http协议还是dubbo协议,我们对这两者在性能方面的影响还存在疑虑。

  • 有Dubbo rpc的性能数据做对比,对自实现的Http rpc,性能应该优化到多少才算最优,心里有个底。

基准测试接口

接口实现不做任何业务处理,排除业务耗时对基准测试的影响。

RPC接口定义:

public interface DemoeService {Result<String> sayHello(String name);
}

提供者实现:

@ServiceProvider
public class DemoeServiceImpl implements DemoeService {@Overridepublic Result<String> sayHello(String name) {Result<String> result = new Result<>(0, name);return result;}
}

基准测试说明

一、以相同配置,不同rpc协议实现注册DemoService服务提供者。

服务提供者参数配置如下:

  • 工作线程数:200 (处理业务)

  • IO线程数:4 (处理数据包的读写、编解码)

二、以相同配置,不同rpc协议创建DemoService服务消费者。

唯一的区别是,使用http rpc协议需要配置连接池,使用dubbo rpc协议只配置单一长连接。

使用http rpc协议,服务消费者连接池配置:

  • 最大连接数:无最大连接数限制;

  • 最大空闲连接数:1024;

三、使用open-jdk官方开源的JMH基准测试工具对DemoService接口分别进行平均耗时测量、吞吐量测量。

环境

  • 本地测试,MacBook Pro 8核16G

  • 尽量关闭多余进程

  • 先启动dubbo协议服务提供者和消费者,测完dubbo协议后,再测http协议

  • dubbo版本:2.6.4 (二次开发过,增加了一些功能特性)

基准测试结果

Http rpc与Dubbo rpc基准测试:

  • 测量指标:平均耗时、吞吐量

  • 预热1次,每次5秒钟

  • 测量5次,每次5秒钟

  • 消费者线程数200(模拟并发)

  • 数据包足够小(调用的接口信息+参数,数据包小于1KB)

初次测试

Http rpc测量结果:

Benchmark                             Mode    Cnt     Score    Error   Units
HttpConsumerBenchmarkTest.testHttp    thrpt    5     1.408 ±   0.235   ops/ms
HttpConsumerBenchmarkTest.testHttp    avgt     5   233.966 ± 163.614   ms/op

Dubbo rpc测量结果:

Benchmark                              Mode  Cnt   Score    Error   Units
DubboConsumerBenchmarkTest.testDubbo  thrpt    5  42.829 ± 24.597  ops/ms
DubboConsumerBenchmarkTest.testDubbo   avgt    5   4.739 ±  0.192   ms/op

测量结果对比

吞吐量 平均耗时

http rpc

1408ops

233.966ms

dubbo rpc

42829ops

4.739ms

此次测试结果数据差别有些大,初步定位耗时在服务端。

经关键步骤打印日记后发现,数据序列化和反序列化耗时比较严重。

经验证后,发现fastjson序列化和反序列化泛型非常耗时,并且改用gson后耗时降低,性能数据表现接近Dubbo rpc。

优化后重新测试

HTTP rpc(使用json + gson)

Benchmark                            Mode  Cnt   Score   Error   Units
HttpConsumerBenchmarkTest.testHttp  thrpt    5  31.550 ± 6.477  ops/ms
HttpConsumerBenchmarkTest.testHttp   avgt    5   6.487 ± 1.512   ms/op

Dubbo rpc(使用hessian2)

Benchmark                              Mode  Cnt   Score    Error   Units
DubboConsumerBenchmarkTest.testDubbo  thrpt    5  42.829 ± 24.597  ops/ms
DubboConsumerBenchmarkTest.testDubbo   avgt    5   4.739 ±  0.192   ms/op

考虑到序列化协议也是影响性能的重要因素,因此我们增加了Dubbo rpc使用json序列化协议的基准测试。

Dubbo(序列化使用fastjson)

Benchmark                              Mode  Cnt   Score   Error   Units
DubboConsumerBenchmarkTest.testDubbo  thrpt    5  21.416 ± 7.571  ops/ms
DubboConsumerBenchmarkTest.testDubbo   avgt    5   9.687 ± 2.329   ms/op

Dubbo(序列化使用gson)

Benchmark                              Mode  Cnt   Score   Error   Units
DubboConsumerBenchmarkTest.testDubbo  thrpt    5  24.460 ± 7.396  ops/ms
DubboConsumerBenchmarkTest.testDubbo   avgt    5   7.743 ± 1.256   ms/op

可以看到,同样使用json序列化协议,且使用gson工具,Http rpc与Dubbo rpc性能相差在0.5~1ms之间,并且Http rpc的耗时略低,吞吐量更高;Dubbo rpc同样使用json序列化协议,使用gson工具与fastjson工具性能相差2ms左右,fastjson性能表现较差。

此测试数据仅供参考!

官方性能压测报告:性能测试报告

Dubbo之HTTP RPC vs Dubbo RPC性能压测相关推荐

  1. 软件性能测试分析与调优实践之路-JMeter对RPC服务的性能压测分析与调优-手稿节选

    一.JMeter 如何通过自定义Sample来压测RPC服务 RPC(Remote Procedure Call)俗称远程过程调用,是常用的一种高效的服务调用方式,也是性能压测时经常遇到的一种服务调用 ...

  2. 云效平台性能测试功能:一个基于Jmeter的性能压测平台

    云效平台性能测试功能(Galaxy)是一个基于Jmeter的性能压测平台,它集脚本.场景.压测.监控和报表展示为一体,是一个能快速.低成本实施压测的平台.降低了入门使用成本,让开发和测试都可以方便的执 ...

  3. Mark - HDFS性能压测工具

    引言 Hadoop生态圈的基石有两个,一个是HDFS文件系统,一个是MR编程框架.第一弹中提到应用MR编程框架实现大规模多机联合负载压测场景的方案,则突出了MR的能力,实际上HDFS作为这一切的基础, ...

  4. HDFS性能压测工具

    转载地址:http://www.taobaotest.com/blogs/2517 引言 Hadoop生态圈的基石有两个,一个是HDFS文件系统,一个是MR编程框架.第一弹中提到应用MR编程框架实现大 ...

  5. 并发模式与 RPS 模式之争,性能压测领域的星球大战

    Photo by Daniel Cheung on Unsplash 本文是 <如何做好性能压测>系列专题分享的第四期,该专题将从性能压测的设计.实现.执行.监控.问题定位和分析.应用场景 ...

  6. 压测接口线程数设置_ZAT掌门性能压测巡检系统实战和落地

    项目背景 随着业务拓展,对于接口性能的要求也在上升,各部门也开始针对部分慢接口进行优化,从测试角度针对这些优化需求进行测试时不仅要保证对应接口的功能正常使用同时也要验证接口优化成果.在日常的开发工作中 ...

  7. 后端服务性能压测实践

    转自:https://mp.weixin.qq.com/s/XW9geHZ9odHdI7srDiKBIg 目录 背景 环境检测 压力机及压力工具检测 Linux openfiles limit 设置 ...

  8. 性能压测诡异的Requests/second 响应刺尖问题

    最近一段时间都在忙着转java项目最后的冲刺,前期的coding翻代码.debug.fixbug都逐渐收尾,进入上线前的性能压测. 虽然不是大促前的性能压测要求,但是为了安全起见,需要摸个底心里有个数 ...

  9. 性能压测,SQL查询异常

    早上测试对性能压测,发现取sequence服务大量超时报错,查询线上的监控SQL: 大量这个查询,我在DeviceID和Isdelete上建有复合索引,应该很快,而且我测试了一下,取值,执行效率很高, ...

最新文章

  1. pandas将dataframe中的特定数据列的内容转化为列表list数据(convert dataframe column values into a list)
  2. 基于OS信号实现Java异步通知
  3. 【Java MyBatis Generator】使用generator自动生成Dao,Mapping和实体文件
  4. 如何使用Spring初始化程序创建Spring Boot项目
  5. 前端学习(3257):js高级教程(1)准备
  6. qt c++ 图片预览_Qt多语言国际化
  7. vue学习---生命周期钩子activated,deactivated
  8. 一个用户下表、批量授予权限给另一个用户
  9. 93. 复原IP地址
  10. 开关电源设计入门到精通系列--序
  11. ubuntu安装Google输入法
  12. 2.4 混合策略和混合策略纳什均衡
  13. uniapp 微信小程序修改BarTitle
  14. iqoo9pro和vivox80哪个值得买
  15. iOS 苹果开发者注册 和 App Store问题咨询
  16. java中的日期格式转换
  17. 计算机版初中语文课文原文,初中语文课文蝉原文
  18. Java Swing中JFreeChart构建柱状图(非3D)时关于取消柱体的高亮问题的解决纪要?
  19. bim建模计算机配置,BIM对电脑配置的要求
  20. 第十一周项目7-太乐了

热门文章

  1. 渗透测试搜索指令整理(一)
  2. 宠物喂食器芯片方案设计
  3. 如何选择网管软件呢?
  4. 干货 | 以太坊Mist负责人教你建立无服务器应用
  5. 教你用c++代码制作:仙剑奇侠传,火爆人气!
  6. 数论基础(相关概念)
  7. 【大数据Zookeeper】之简介
  8. Linux-虚拟机中大小写不停切换问题解决办法
  9. Monaca Web IDE 初体验 —— 开发PhoneGap/Cordova应用程序,还用什么Eclipse/XCode!
  10. 【My Electronic Notes系列——时序逻辑电路】