Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
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.thriftstruct 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秒,其它两个框架表现不是太好。
更多技术资讯可关注:itheimaGZ获取

RPC 框架性能大比拼的更多相关文章

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

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

  2. 【转载】分布式RPC框架性能大比拼

    dubbo.motan.rpcx.gRPC.thrift的性能比较 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 ...

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

    https://github.com/grpc/grpc http://colobu.com/2016/09/05/benchmarks-of-popular-rpc-frameworks/ http ...

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

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

  5. RPC框架性能基本比较测试

    RPC框架:gRPC.Thrift.Wildfly.Dubbo 原文链接:http://www.open-open.com/lib/view/open1426302068107.html gRPC是G ...

  6. EntityFramework、Dapper vs 草根框架性能大比拼,数据库访问哪家强?

    扯淡 当前市面上 ORM 很多,有跑车型的,如 Dapper,有中规中矩型的,如 Mybatis.Net,也有重量型的,如 EntityFramework 和 NHibernate,还有一些出自草根之 ...

  7. rpc框架之gRPC 学习 - hello world

    grpc是google在github于2015年开源的一款RPC框架,虽然protobuf很早google就开源了,但是google一直没推出正式的开源框架,导致github上基于protobuf的r ...

  8. 服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

    转自: http://blog.csdn.net/liubenlong007/article/details/54692241 概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺 ...

  9. dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型

    概述 前段时间项目要做服务化,所以我比较了现在流行的几大RPC框架的优缺点以及使用场景,最终结合本身项目的实际情况选择了使用dubbox作为rpc基础服务框架.下面就简单介绍一下RPC框架技术选型的过 ...

随机推荐

  1. 同时运行两个版本相同的tomcat

    由于项目需要,代理集群和一个节点都部署在本地,那么就需要有两个tomcat,一个部署集群,一个部署项目,我都用了7.0.34版本的tomcat 当启动代理的tomcat成功时,再启动节点的tomcat ...

  2. JS—DOM操作

    节点分为三类: 1.元素节点:标签<div></div> 2.文本节点:标签内的纯文本. 3.属性节点:标签内的属性,id或class 查找元素: getElementById ...

  3. python3 文件流

    文件流 # python里的打开一个文件用open(),如果不能打开,会抛出异常:OSError # 文件流的基本参数 # . file: 打开一个文件 # . mode: 打开的模式,默认模式为tx ...

  4. HDU - 1754 线段树

    #include <algorithm> #include <iostream> #include<sstream> #include<cstring> ...

  5. Kali 时间修改

    前言 装了新版本的 Kali 之后发现默认的时间和实际的时间不太一样 查了资料说 linux 的默认时间是格林威治时间,即从本初子午线为0时区 以下是 kali 修改时间的方法 1.tzselect ...

  6. C语言中未定义的引用错误

    1.错误描述: /tmp/ccAu32Cb.o:在函数‘main’中:static.c:(.text+0x2d):对‘print_value’未定义的引用 2.通过对错误内容分析,我在编写程序时,ma ...

  7. Mac环境下 Python3安装及配置

    1.mac 环境下安装 python3 .查看 mac 自带系统版本 #查看系统自带的python open /System/Library/Frameworks/Python.framework/V ...

  8. 项目中关于RPC 和rocketMQ使用场景的感受

    在花生待的这半年,切身体会了系统之间交互场景的接口技术实现方式,个人总结.仅供参考: 1.关于rpc接口,一般情况下 都是同步的.A系统的流程调用B系统.等着B返回,根据返回结果继续进行A接下来的流程 ...

  9. Linux inode的正确理解

    一.inode是什么? 理解inode,要从文件储存说起. 文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector).每个扇区储存512字节(相当于0.5KB). 操作系统 ...

  10. 吴裕雄--天生自然python学习笔记:python 用pygame模块开发俄罗斯方块游戏

    俄罗斯方块游戏 多年前,游戏机中最流行的游戏就是“俄罗斯方块”了.时至今日,虽然网络 游戏日新月异 ,但“俄罗斯方块”这款小游戏仍在许多人心中 占有一席之地.本例中, 我们将亲手设计一个简单的俄罗斯方 ...