RPC框架性能基本比较测试

go微服务系列(十一):gRPC和Thrift使用与选型 其实,除了 gRPC 外,Facebook 开源的 Thrift 框架也是业界较为流行的 RPC 方案,比如 HBase 就是使用它来提供 API 支持的。gRPC 是由 Google 开源的高性能 RPC 框架。自 2015 年发布以来,gRPC 日益成熟,并成为跨语言 RPC 通信中最流行也最受欢迎的选择之一。gRPC 拥有很多特性,其中最引人注目的有以下几个方面:1.内置流式 RPC 支持。这意味着你可以使用同一 RPC 框架来处理普通的 RPC 调用和分块进行的数据传输调用,这在很大程度上统一了网络 阅读详情


gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言。 我们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在快马加鞭的加以支持。 我们可以设想一下,未来浏览器支持HTTP2.0,并通过现有开源序列化库比如protobuf等,可以直接和各种语言的服务进行高效交互,这将是多么“美好”的场景!

gPRC的Java实现底层网络库是Netty,而且是用到最新的Netty5.0.0.Alpha3的开发版本,因为最新版本针对HTTP/2做了很多改进。 为了跨语言,gPRC也和其他方案一样,采用了类似古老IDL的接口描述语言,利用自家的Protobuf项目带的protoc编译器来生成框架代码。这和目前最流行的Facebook开源的,现为Apache顶级项目的Thrift原理一致。

我比较好奇,这个新出世的框架的性能怎么样,和现有的RPC开源方案比较如何。就花了一些时间进行简单比较。 我选择了以下四种开源项目进行测试:gRPC, Thrift, Wildfly, Dubbo。 为了简化,测试范例都使用项目自带的demo或者sample等进行简单修改,使得跨进程网络调用次数一致。

gRPC https://github.com/grpc/grpc

  1. 从Github master主干上获得最新版本,按照说明文件进行编译。如上所述,网络框架是Netty5,基于最新的HTTP/2.

  2. 测试例子为 RouteGuideClient

  3. IDL为 route_guide.proto

  4. 选择其中getFeature方法,去除不用的语句和屏幕输出,进行10,000次同步调用。

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    TestClientSync client = new TestClientSync( "localhost" , 8980 );
    try {
       final long startTime = System.nanoTime();
     
       for ( int i = 0 ; i < 10000 ; i++)
         client.getFeature( 409146138 , - 746188906 );
     
       final long endTime = System.nanoTime();
       info( "method 1 : " + (endTime - startTime));
    }

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void getFeature( int lat, int lon) {
       try {
         Point request = Point.newBuilder().setLatitude(lat).setLongitude(lon).build();
         Feature feature = blockingStub.getFeature(request);
       } catch (RuntimeException e) {
         logger.log(Level.WARNING, "RPC failed" , e);
         throw e;
       }
    }


多次执行,记录需要的时间。

gRPC还有一种非阻塞的调用方法,不过因为时间有限,为了简化测试,我只用标准的server启动的方式,asyncStub在大并发访问时出错,用时也较长,故这次测试没有这种方法的结果数据。

Thrift http://thrift.apache.org

  1. 从Apache网站获得最新的0.9.2版本,本机编译获得C的编译器和Java运行环境。

  2. 测试例子为 JavaClient.java

  3. IDL tutorial.thrift

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int diff;
    final long startTime = System.nanoTime();
    try {
       for ( int i = 0 ; i < 10000 ; i++)
          diff = client.calculate( 1 , work);
    } catch (InvalidOperation io) {
       System.out.println( "Invalid operation: " + io.why);
    }
    final long endTime = System.nanoTime();
    System.out.println( "method 1 : " + (endTime - startTime));


Thrift采用经典的基于网络端口的RPC,效率最高,在最后的总结数据可以看到。

Wildfly 8.2.0 http://www.wildfly.org

Wildfly是JBossAS改名后的JBoss应用服务器,实现了完整的JavaEE规范。我们知道JavaEE中远程RPC调用是在EJB规范中定义的。我们这里就是要测试Wildlfy中的远程EJB调用能力, 选用的Wildfly8.2是目前发布的最新稳定版本。这个版本也支持端口多路服用,也就是EJB远程调用是通过HTTP端口复用来进行的,利用HTTP的Upgrade机制做到二进制运行时刻协商升级。 尽管不是纯粹的HTTP/2,但也运行机理也相差无几。

  1. 测试例子选用jboss-eap-quickstarts项目中的远程ejb调用例子 RemoteEJBClient.java

  2. 纯Java的RPC方案好处是不需要再有IDL文件定义和编译生成代码的过程,只要商议好接口就可以了

    ?
    1
    2
    3
    public interface RemoteCalculator {
         int add( int a, int b);
    }

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int sum= 0 ;
    final long startTime = System.nanoTime();
     
    for ( int i = 0 ; i < 10000 ; i++) {
              sum = statelessRemoteCalculator.add(a, b);
    }
     
    final long endTime = System.nanoTime();
    System.out.println( "method 1 : " + (endTime - startTime));


调用无状态的SessionBean方法10,000次,对应的远程EJB服务是部署在Wildfly应用服务器中的EJB。

Dubbo 2.5.4-SNAPSHOT https://github.com/alibaba/dubbo

Dubbo是阿里集团开源的一个极为成员的RPC框架,在很多互联网公司和企业应用中广泛使用。协议和序列化框架都可以插拔是及其鲜明的特色。同样 的远程接口是基于Java Interface,并且依托于spring框架方便开发。可以方便的打包成单一文件,独立进程运行,和现在的微服务概念一致。

  1. 采用github中master主干,目前版本是 2.5.4-SNAPSHOT

  2. 测试例子选用其中的demo进行修改 DemoAction.java

    ?
    1
    2
    3
    public interface DemoService {
         String sayHello(String name);
    }

    ?
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    final long startTime = System.nanoTime();
     
    for ( int i = 0 ; i < 10000 ; i ++) {
         try {
             String hello = demoService.sayHello( "world" + i);
         } catch (Exception e) {
             e.printStackTrace();
         }
    }
    final long endTime = System.nanoTime();
    System.out.println( "method 1 : " + (endTime - startTime));


调用完毕后查看输入log文件获得运行时间。

数据结果。

最终经过4轮测试,不间断运行10,000次远程RPC调用后的结果如下:

RPC框架性能基本比较测试

我们可以看到Thrift的效率最高,大概领先一个数量级。而其他三个项目的性能数据在同数量级中,由高到低分别为dubbo, wildfly和gRPC。

需要说明的有以下几点:

  1. 为了简化测试,我并没有选择同样的调用接口,而是顺手用了项目自带的,方便修改的示例程序。其中gRPC和Thrift的接口有对象传递,稍微复杂一些。

  2. 不是严格的性能测试流程,比如没有做预热过程,以及测试都运行在我的桌面用机上,没有完全恢复成“干净”的状态。

  3. 都是简单的服务器单一进程实例,标准示范例子,没有做特别优化和设置多个线程池之类的。而客户端调用也是最简单的阻塞式多次调用压力测试。应该是用多个机器多连接,多个线程,以及异步非阻塞的调用多种环境进行测试更为客观,有机会再继续完善。

  4. 之前没有看到过基于HTTP/2的RPC调用性能比较,理论上是应该低于经典的基于端口的RPC方案的。这个测试结果可以简单印证这个猜想。 Thrift的数据遥遥领先.gRPC还在开发之中,基于的Netty还是alpha版本,而且非阻塞的方式还没有最后的数据。我想耐心一些,给gRPC 一些时间,它会让我们惊艳的。

  5. Wildfly表现良好,要知道它的服务端可是完整的JavaEE服务器啊。不过有时间的化,我试试看经典RMI连接的效率如何,要是能和thrift一个数量级就更好了。

  6. dubbo性能也很出色,而且协议层可以更换的话,应该还能有更大提升。

  7. 我的测试在一台过时的笔记本上,受条件限制,没有先进的G级网络和多台服务器进行标准化性能测试。如果哪位在互联网或者企业工作的朋友有条件,也愿意充分完成这个测试,请和我联系,我会完整介绍我的测试搭建环境,共享代码,并帮助完成。我想那个结果会更有意义。

来自: http://www.useopen.net/blog/2015/rpc-performance.html
nirum:Nirum:用于微服务的IDL编译器和RPC分布式对象框架 尼鲁姆 Nirum是编译器和 /的框架,建立在现代Web服务器技术之上,如RESTful HTTP服务和JSON。 您可以在examples/目录中的源代码中找到该语言的外观。 请注意,其设计非常不稳定,可以更改。 而且功能集还不完整。 安装 Nirum编译器可在Linux,macOS和Windows等大多数主要平台上运行。 我们为这三个平台提供了预构建的可执行二进制文件。 发布的版本 您可以从下载适用于Linux(x86_64),macOS(x86_64)或Windows(x64)的可执行二进制文件。 您应该根据您的平台为其赋予适当的权限(例如+x )。 如果您要查找以前的版本,请参 立即下载

相关推荐

Gem5模拟器,详解官网教程Event-driven programming(五)

Gem5模拟器,详解官网教程Event-driven programming、时间调度、如何自定义SimObject

qq_46675545的博客 2041

流行的rpc框架性能测试对比

本文转载自鸟窝的博客 流行的rpc框架benchmark 2018新春版 目录 [−] 本文测试的RPC框架 测试场景 模拟业务处理时间 测试数据 测试client 测试指标 测试环境 测试结果 处理时间 0ms 处理时间 10ms 处理时间 30ms 随着公司规模的扩大,以及业务量的激增,单体应用逐步演化为服务/微服务的架构模式, 服务之间的调用大多采用rpc的方式调用,或者消...

yoqu的专栏 4万+

5nm制程的CV5芯片实测:用它给无人机做8K拍摄和实时避障,功耗和性能到底怎么样?

本文深度评测了5nm制程的CV5芯片在无人机8K拍摄和实时避障中的表现。通过实测数据展示了CV5的异构计算架构、8K视频编码性能和CVflow®AI引擎的加速效果,同时提供了开发中的优化技巧和散热建议,为无人机开发者提供了实用的参考。

weixin_30861797的博客 359

各种RPC框架的对比

RPC(Remote Procedure Call)框架是用于实现分布式系统中远程通信的工具,常见的RPC框架有很多,其中比较知名的包括 gRPC、Apache Dubbo、Thrift 等。

Alaskan_Husky的博客 1549

ABAP内表数据导出Excel:OLE、ALV与GUI_DOWNLOAD方案全解析

在企业级应用开发中,数据导出是连接后台系统与前端业务分析的关键桥梁。其核心原理是将结构化数据转换为通用文件格式,以实现跨平台的数据交换与可视化。从技术价值看,一个健壮的导出功能能显著提升数据处理效率,减少人工干预,是衡量系统实用性的重要指标。常见的应用场景包括报表生成、数据交接和临时数据提取。本文聚焦于SAP ABAP开发领域,深入探讨如何将内表数据高效、稳定地导出至Excel,涵盖了OLE自动化、ALV标准导出以及基于CL_GUI_FRONTEND_SERVICES与GUI_DOWNLOAD的通用方案,并

weixin_32715349的博客 325

Office 365部分安装及同时安装Visio的方法

From MWeb Win版本的Office 365安装包默认安装所有组件,没有选择的页面,在安装Office 365后再安装下载的Visio 2016专业版时,会显示计算机上已经安装了即插即用Office,Visio不可安装,因此可以考虑使用Office部署工具来解决这两个问题。 下载安装Office365和Visio 下载Office部署工具 修改配置 部署工具使用方法...

weixin_30737363的博客 2万+

RPC框架选型:gRPC、Thrift、Dubbo、Spring Cloud

而 Spring Cloud 就像品牌机,在 Spring Source 的整合下,做了大量的兼容性测试,保证了机器拥有更高的稳定性,但是如果要在使用非原装组件外的东西,就需要对其基础有足够的了解。一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。Spring Cloud 基于 Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。

zhangjunli的博客 4323

从Android到鸿蒙:UI框架迁移的实战指南与最佳实践

本文为Android开发者提供了将应用UI框架迁移至鸿蒙系统的实战指南。文章深入对比了Android命令式编程与鸿蒙ArkUI声明式编程的核心差异,详细讲解了从环境配置、布局迁移(如RecyclerView转List)、逻辑处理到多设备适配与性能优化的全流程最佳实践,帮助开发者高效完成迁移工作。

weixin_29208077的博客 435

python rpc 性能比较_RPC框架性能基本比较测试

gRPC是Google最近公布的开源软件,基于最新的HTTP2.0协议,并支持常见的众多编程语言。 我们知道HTTP2.0是基于二进制的HTTP协议升级版本,目前各大浏览器都在快马加鞭的加以支持。 我们可以设想一下,未来浏览器支持HTTP2.0,并通过现有开源序列化库比如protobuf等,可以直接和各种语言的服务进行高效交互,这将是多么“美好”的场景!gPRC的Java实现底层网络库是Netty...

weixin_39745933的博客 589

开源人形机器人硬件生态:关键技术、产业链与低成本突破 | OpenLoong 社区线下分享会

本文将深入探讨人形机器人硬件平台的关键技术、产业链与核心部件以及降低成本的策略。从硬件平台的核心技术,到机器人核心零部件的详细介绍,再到产业链各环节的协同发展以及实现低成本化的创新思路,将一同剖析人形机器人迈向广泛应用所面临的挑战与机遇,展望其未来的发展趋势,为开发者和相关从业者提供一些参考与启示。

OpenLoong_的博客 2423

手把手教你学simulink(13.2)--构建一个单相并网逆变器Simulink仿真模型

基于Simulink的单相并网逆变器项目的详细仿真实例。这个项目将重点放在逆变器的详细建模、最大功率点跟踪(MPPT)控制策略、并网控制和仿真分析上。我们将使用MATLAB/Simulink来构建整个系统,并通过具体的代码和模块来实现各个功能。

MHD0815的博客 546
上一篇: Java 工程师成神之路
下一篇: Mysql 实现 三目运算判断
JavaAlpha
博客等级 码龄18年 910粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值