分布式RPC框架性能大比拼 dubbomotanrpcxgRPCthrift的性能比较
Posted 微wx笑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式RPC框架性能大比拼 dubbomotanrpcxgRPCthrift的性能比较相关的知识,希望对你有一定的参考价值。
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 框架的比较,敬请收藏本文网址
以下是它们的功能比较:
Dubbo | Montan | rpcx | gRPC | Thrift | |
---|---|---|---|---|---|
开发语言 | Java | Java | Go | 跨语言 | 跨语言 |
分布式(服务治理) | √ | √ | √ | × | × |
多序列化框架支持 | √ | √ (当前支持Hessian2、Json,可扩展) | √ | × (只支持protobuf) | × (thrift格式) |
多种注册中心 | √ | √ | √ | × | × |
管理中心 | √ | √ | √ | × | × |
跨编程语言 | × | × (支持php client和C server) | × | √ | √ |
对于RPC的考察, 性能是很重要的一点,因为RPC框架经常用在服务的大并发调用的环境中,性能的好坏决定服务的质量以及公司在硬件部署上的花费。
本文通过一个统一的服务,测试这四种框架实现的完整的服务器端和客户端的性能。
这个服务传递的消息体有一个protobuf文件定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | 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 [d |