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

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框架的测试。

- END -

关注Java技术栈微信公众号,在后台回复关键字:Java,可以获取一份栈长整理的 Java 最新技术干货。

最近干货分享

点击「阅读原文」加入栈长的战队~

Java RPC 分布式框架性能大比拼,Dubbo排老几?相关推荐

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

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

  2. java后端分布式框架路线图

    基于Spring全家桶的java后端分布式框架 框架图 框架图 最近开始在公司实习(摸鱼ing),自己理了一下后端分布式的大体框架,可以如以下简单的示意图所示(抽象派画家O(∩_∩)O...) 首先用 ...

  3. Java 微服务框架选型(Dubbo 和 Spring Cloud?),大厂 HR 如何面试

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 微服 ...

  4. Java 微服务框架选型(Dubbo 和 Spring Cloud?)

    |来源:博客园 |链接:https://www.cnblogs.com/xishuai/archive/2018/04/13/dubbo-and-spring-cloud.html 微服务(Micro ...

  5. Java 微服务框架选型(Dubbo 和 Spring Cloud)

    微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任 ...

  6. Java 微服务框架对比:Dubbo 和 Spring Cloud

    微服务特点: 微服务(Microservices)是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成. 独立部署 松耦合 单一职责,每个服务仅关注一件任务 微服务框架 相关概念: rpc 1. ...

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

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

  8. Java分布式 RPC 框架性能大比拼,Dubbo真的最差吗?

    点击上方"搜云库技术团队",选择"设为星标" 回复"1024"或"面试题"获取学习资料 Dubbo 是阿里巴巴公司开源的 ...

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

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

最新文章

  1. 将ubuntu系统设置静态ip及ssh
  2. 苹果首任AI总监Ruslan Salakhutdinov:如何应对深度学习的两大挑战?(附视频)
  3. 【性能优化实战】java嵌入式开发pos
  4. makefile使用--Wall选项(二)
  5. 组播穿越MPLS ×××+SSM
  6. 2道python基础练习
  7. 主线程 唤醒_Java等待唤醒机制统计子线程运行时间的方式及其疑问
  8. 计算机报名成功后还可以取消吗,【造价工程师报名信息确认后可以取消吗?如何取消?】- 环球网校...
  9. 二维数组各行求和_数组入门 | 数组的维度和尺寸
  10. 多系统并行服务器,具有分布式并行I/O接口的分布式并行服务器系统的性能研究...
  11. 联想高校AI精英挑战赛中大收官,“人工智能眼科机器人”获全国总决赛最后入场券
  12. Transformer预训练模型已经变革NLP领域,一文概览当前现状
  13. make menuconfig显示错误“Your display is too small to run Menuconfig!”
  14. 谷歌云盘快速下载大文件
  15. 一台计算机多个屏幕,一台主机两个显示器,详细教您电脑两个显示器怎么设置...
  16. 3-11 查询水果价格
  17. React.memo Component definition is missing display name
  18. 角度逼近圆弧插补法插补与仿真
  19. 使用JavaBean封装对数据库的访问、连接池的配置和使用
  20. Android studio成品 记账本(附带文档)

热门文章

  1. apos mysql,The /usr/local/mysql/data directory is not owned by the apos;mysqlapos; to apos;_mysql...
  2. 彻底删除的文件如何恢复?误删数据恢复,四种方法就可以解决
  3. datagrip无法提示字段
  4. 【1053】最大数输出
  5. Android返回键
  6. 基于Python的毕业论文怎么写?
  7. Android Native APP开发笔记:文件存储与访问
  8. js面向对象怎么理解
  9. SQL中的PRIMARY KEY(PK)(主键)和Foreign Key (FK)(外键解析
  10. matlab 按字母排序,matlab命令大全(按字母排序) 总汇详解最新发布完整珍藏版