点击上方“搜云库技术团队”,选择“设为星标”

回复“1024”或“面试题”获取学习资料

Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。

不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(非开源)有竞争关系,导致dubbo团队已经解散,反到是当当网的扩展版本仍在持续发展,墙内开花墙外香。

参见:

http://www.oschina.net/news/55059/druid-1-0-9 中的评论

其它的一些知名电商如当当、京东、国美维护了自己的分支或者在dubbo的基础开发,但是官方的库缺乏维护,相关的依赖类比如Spring,Netty还是很老的版本(Spring 3.2.16.RELEASE, netty 3.2.5.Final),倒是有些网友写了升级Spring和Netty的插件。

Motan 是新浪微博开源的一个Java 框架。它诞生的比较晚,起于2013年,2016年5月开源。Motan 在微博平台中已经广泛应用,每天为数百个服务完成近千亿次的调用。

rpcx 是Go语言生态圈的Dubbo, 比Dubbo更轻量,实现了Dubbo的许多特性,借助于Go语言优秀的并发特性和简洁语法,可以使用较少的代码实现分布式的RPC服务。

gRPC 是Google开发的高性能、通用的开源RPC框架,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于ProtoBuf(Protocol Buffers)序列化协议开发,且支持众多开发语言。本身它不是分布式的,所以要实现上面的框架的功能需要进一步的开发。

thrift 是Apache的一个跨语言的高性能的服务框架,也得到了广泛的应用。

以下是它们的功能比较:

对于RPC的考察, 性能是很重要的一点,因为RPC框架经常用在服务的大并发调用的环境中,性能的好坏决定服务的质量以及公司在硬件部署上的花费。

本文通过一个统一的服务,测试这四种框架实现的完整的服务器端和客户端的性能。

这个服务传递的消息体有一个protobuf文件定义:

syntax = "proto2";
package main;
option optimize_for = SPEED;
message BenchmarkMessage {  required string field1 = 1;    optional string field9 = 9;    optional string field18 = 18;  optional bool field80 = 80 [default=false];   optional bool field81 = 81 [default=true];    required int32 field2 = 2; required int32 field3 = 3; optional int32 field280 = 280; optional int32 field6 = 6 [default=0];    optional int64 field22 = 22;   optional string field4 = 4;    repeated fixed64 field5 = 5;   optional bool field59 = 59 [default=false];   optional string field7 = 7;    optional int32 field16 = 16;   optional int32 field130 = 130 [default=0];    optional bool field12 = 12 [default=true];    optional bool field17 = 17 [default=true];    optional bool field13 = 13 [default=true];    optional bool field14 = 14 [default=true];    optional int32 field104 = 104 [default=0];    optional int32 field100 = 100 [default=0];    optional int32 field101 = 101 [default=0];    optional string field102 = 102;    optional string field103 = 103;    optional int32 field29 = 29 [default=0];  optional bool field30 = 30 [default=false];   optional int32 field60 = 60 [default=-1]; optional int32 field271 = 271 [default=-1];   optional int32 field272 = 272 [default=-1];   optional int32 field150 = 150; optional int32 field23 = 23 [default=0];  optional bool field24 = 24 [default=false];   optional int32 field25 = 25 [default=0];  optional bool field78 = 78;    optional int32 field67 = 67 [default=0];  optional int32 field68 = 68;   optional int32 field128 = 128 [default=0];    optional string field129 = 129 [default="xxxxxxxxxxxxxxxxxxxxx"];   optional int32 field131 = 131 [default=0];
}

相应的Thrift定义文件为

namespace java com.colobu.thrift
struct BenchmarkMessage
{   1:  string field1,  2:  i32 field2, 3:  i32 field3, 4:  string field4,  5:  i64 field5, 6:  i32 field6, 7:  string field7,  9:  string field9,  12:  bool field12,  13:  bool field13,  14:  bool field14,  16:  i32 field16,   17:  bool field17,  18:  string field18,    22:  i64 field22,   23:  i32 field23,   24:  bool field24,  25:  i32 field25,   29:  i32 field29,   30:  bool field30,  59:  bool field59,  60:  i32 field60,   67:  i32 field67,   68:  i32 field68,   78:  bool field78,  80:  bool field80,  81:  bool field81,  100:  i32 field100, 101:  i32 field101, 102:  string field102,  103:  string field103,  104:  i32 field104, 128:  i32 field128, 129:  string field129,  130:  i32 field130, 131:  i32 field131, 150:  i32 field150, 271:  i32 field271, 272:  i32 field272, 280:  i32 field280,
}
service Greeter {   BenchmarkMessage say(1:BenchmarkMessage name);
}

事实上这个文件摘自gRPC项目的测试用例,使用反射为每个字段赋值,使用protobuf序列化后的大小为 581 个字节左右。因为Dubbo和Motan缺省不支持Protobuf,所以序列化和反序列化是在代码中手工实现的。

服务很简单:

service Hello { // Sends a greeting rpc Say (BenchmarkMessage) returns (BenchmarkMessage) {}
}

接收一个BenchmarkMessage,更改它前两个字段的值为"OK" 和 100,这样客户端得到服务的结果后能够根据结果判断服务是否正常的执行。

Dubbo的测试代码改自:

https://github.com/alibaba/dubbo/tree/master/dubbo-demo

Motan的测试代码改自:

https://github.com/weibocom/motan/tree/master/motan-demo

rpcx和gRPC的测试代码在:

https://github.com/smallnest/rpcx/tree/master/_benchmarks

Thrift使用Java进行测试。

正如左耳朵耗子对Dubbo批评一样,Dubbo官方的测试不正规 (性能测试应该怎么做?)。

本文测试将用吞吐率、相应时间平均值、响应时间中位数、响应时间最大值进行比较(响应时间最小值都为0,不必比较),当然最好以Top Percentile的指标进行比较,但是我没有找到Go语言的很好的统计这个库,所以暂时比较中位数。

另外测试中服务的成功率都是100%。

测试是在两台机器上执行的,一台机器做服务器,一台机器做客户端。

两台机器的配置都是一样的,比较老的服务器:

  • CPU: Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz, 24 cores

  • Memory: 16G

  • OS: Linux 2.6.32-358.el6.x86_64, CentOS 6.4

  • Go: 1.7

  • Java: 1.8

  • Dubbo: 2.5.4-SNAPSHOT (2016-09-05)

  • Motan: 0.2.2-SNAPSHOT (2016-09-05)

  • gRPC: 1.0.0

  • rpcx: 2016-09-05

  • thrift: 0.9.3 (java)

分别在client并发数为100、500、1000、2000 和 5000的情况下测试,记录吞吐率(每秒调用次数, Throughput)、响应时间(Latency) 、成功率。

(更精确的测试还应该记录CPU使用率、内存使用、网络带宽、IO等,本文中未做比较)

首先看在四种并发下各RPC框架的吞吐率:rpcx的性能遥遥领先,并且其它三种框架在并发client很大的情况下吞吐率会下降。thrift比rpcx性能差一点,但是还不错,远好于gRPC,dubbo和motan,但是随着client的增多,性能也下降的很厉害,在client较少的情况下吞吐率挺好。

在这四种并发的情况下平均响应:

这个和吞吐率的表现是一致的,还是rpcx最好,平均响应时间小于30ms, Dubbo在并发client多的情况下响应时间很长。我们知道,在微服务流行的今天,一个单一的RPC的服务可能会被不同系统所调用,这些不同的系统会创建不同的client。如果调用的系统很多,就有可能创建很多的client。这里统计的是这些client总的吞吐率和总的平均时间。

平均响应时间可能掩盖一些真相,尤其是当响应时间的分布不是那么平均,所以我们还可以关注另外一个指标,就是中位数。这里的中位数指小于这个数值的测试数和大于这个数值的测试数相等。

gRPC框架的表现最好。

另外一个就是比较一下最长的响应时间,看看极端情况下各框架的表现: rpcx的最大响应时间都小于1秒,Motan的表现也不错,都小于2秒,其它两个框架表现不是太好。

本文以一个相同的测试case测试了四种RPC框架的性能,得到了这四种框架在不同的并发条件下的性能表现。期望读者能提出宝贵的意见,以便完善这个测试,并能增加更多的RPC框架的测试。

敬请关注「搜云库技术团队」微信公众号,获取最新文章

来源:http://985.so/aXe2

整编:搜云库技术团队,欢迎广大技术人员投稿

如果对本文的内容有疑问,请在文章留言区留言,谢谢。

》》》福利 + 程序员工作内推群《《《

2000道 互联网Java工程师 面试题 共768页.pdf

关注公众号并回复:面试题” 无套路获取

更多技术干货

推荐:近300篇:历史技术文章,20大分类整理

1、懂点 Nginx 如何实现反向代理与负载均衡,是面试加分项 2、面试官:SpringBoot jar 可执行原理,知道吗? 3、很高兴!终于在生产上踩到了慢查询优化的坑 4、精选 Dubbo RPC 面试题,比较全面,含答案 5、Logback 这样配置,TPS提高10倍

Java分布式 RPC 框架性能大比拼,Dubbo真的最差吗?相关推荐

  1. Java分布式 RPC 框架性能大比拼,Dubbo最差?

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RP ...

  2. Java 分布式 RPC 框架性能大比拼,Dubbo 排第几?

    Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成. 不过,略有遗憾的是,据说在淘宝内部,du ...

  3. 分布式RPC框架性能大比拼 dubbo、motan、rpcx、gRPC、thrift的性能比较

    Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成.不过,略有遗憾的是,据说在淘宝内部,dub ...

  4. 分布式RPC框架性能大比拼

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:鸟窝 链接:http://985.so/aXe2 Dubbo ...

  5. java 分布式rpc框架_分布式RPC框架Apache Dubbo(一)

    4 Dubbo快速入门 Dubbo作为一个RPC框架,其最核心的功能就是要实现跨网络的远程调用.本小节就是要创建两个应用,一个作为服务的提供方,一个作为服务的消费方.通过Dubbo来实现服务消费方远程 ...

  6. 分布式RPC框架dubbo、motan、rpcx、gRPC、thrift简介与性能比较

    分布式RPC框架性能大比拼 dubbo.motan.rpcx.gRPC.thrift的性能比较  Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现 ...

  7. dubbo-快速入门-分布式RPC框架Apache Dubbo

    文章目录 分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 1.1 单体架构 1.2 垂直架构 1.3 SOA架构 1.4 微服务架构 2. Apache Dubbo概述 2.1 D ...

  8. 分布式RPC框架Apache Dubbo

    分布式RPC框架Apache Dubbo 1. 软件架构的演进过程 软件架构的发展经历了由单体架构.垂直架构.SOA架构到微服务架构的演进过程,下面我们分别了解一下这几个架构. 1.1 单体架构 1. ...

  9. 还发愁项目经验吗?基于Netty实现分布式RPC框架[附完整代码]

    写给大家的话 最近我收到很多读者的来信,对如何学习分布式.如何进行项目实践和提高编程能力,存在很多疑问. 分布式那么难,怎么学?为什么看了那么多书还是掌握不了? 开源的框架比如Dubbo代码太多了,完 ...

最新文章

  1. sklearn使用投票器VotingClassifier算法构建多模型融合的硬投票器分类器(hard voting)并计算融合模型的混淆矩阵、可视化混淆矩阵(confusion matrix)
  2. 揭秘又拍云凭啥做到两年估值超10亿?
  3. 波士顿大学数学与计算机科学,2021战报 | 美国波士顿大学金融数学硕士录取
  4. C语言的结构使用和结构对齐
  5. tf里面InteractivateSession()与Session()的区别
  6. 原百万访问量博客http://blog.chinaunix.net/uid/20656672.html不再维护(10年前数百篇oracle/teradata性能优化、故障处理案例)...
  7. View与Model绑定注意事项 (视图无数据显示)
  8. linux 性能调优
  9. 【深度】专访华宝基金首席信息官李孟恒:搭建数据驱动引擎,开创投研一体新格局
  10. 用C# 设置excel单元格格式
  11. 基于三维激光雷达的二维占据栅格地图构建-简介
  12. 跟同事关系再好,这3种话宁烂肚里也别张嘴,莫让福运悄悄离开你
  13. 估值择时对ETF基金定投的影响
  14. Android 3D画廊采用Gallery实现无限循环、自动轮播
  15. 计算机专业 大学物理课程简介,大学物理A课程简介.doc
  16. 电脑卡,电脑卡到不行?原因和解决方法都在这里了!
  17. 计算机音乐谱夜空中最亮的星歌词,夜空中最亮的星歌谱及歌词
  18. Java有哪些访问修饰符呢?
  19. PC DMIS三坐标产品测量编程视频教程+资料
  20. WiFi万能钥匙App可一键登录全国215个城市的“爱WiFi”

热门文章

  1. Java并发 -- JMM
  2. 呼叫中心最难的问题是什么?
  3. 驼峰命名法模态对话框
  4. How can I create an Asynchronous function in Javascript?
  5. 使用 USB 设备安装 Windows 10虚拟机
  6. Vim对中文编码的支持[转]
  7. 感恩有你,链客一周年!
  8. 主键SQL教程–如何在数据库中定义主键
  9. 用户体验改善案例_如何检测用户的设备,以便改善他们的用户体验
  10. 女性程序员大会ghc_在女性科技大会上成为男人的感觉