rpc框架性能基本比较测试

ZSQ的博客 ZSQ的博客     2022-08-17     420

关键词:

RPC框架:gRPC、Thrift、Wildfly、Dubbo

原文链接:http://www.open-open.com/lib/view/open1426302068107.html

 

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次同步调用。

    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));
    }

    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

    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文件定义和编译生成代码的过程,只要商议好接口就可以了

    public interface RemoteCalculator {
        int add(int a, int b);
    }

    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-SNAPSHOThttps://github.com/alibaba/dubbo

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

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

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

    public interface DemoService {
    	String sayHello(String name);
    }

    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调用后的结果如下:

技术分享

我们可以看到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




rpc框架jmh测试-chatgpt自动生成(代码片段)

本文将介绍如何使用Java的JMH测试框架来测试RPC框架的性能。我们选择了ApacheDubbo作为目标RPC框架,Dubbo是一种高效的远程调用框架,它支持多种传输协议和序列化协议,并且具有很好的可扩展性。我们将测试Dubbo框架的性能,以... 查看详情

转载分布式rpc框架性能大比拼

...比较Dubbo是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的RPC实现服务的输出和输入功能,可以和Spring框架无缝集成。不过,略有遗憾的是,据说在淘宝内部,dubbo由于跟淘宝另一个类似的框架HSF(... 查看详情

七种websocket框架的性能比较

                七种WebSocket框架的性能比较最近我又使用几个框架实现了websocketpush服务器的原型,并专门对这七种实现做了测试。本文记录了测试结果和一些对结果的分析。这七种框架是:Netty:http://netty.io/... 查看详情

restrpc:简单易用高性能的开源rpc框架(代码片段)

Motivation目前传统的C++RPC框架一般都是基于protobuf或者是thrift,都需要用专门的代码生成器来生成代码,这种方式存在以下这些问题:使用麻烦。使用时需要先写一个DSL描述文件,然后用代码生成器来生成代... 查看详情

rpc框架:thrift和protobuf有啥区别?

都是数据交换,整合多种语言,应用的解决方案。性能都差不多.相比较而言,thrift稍微强些.支持的数据格式也多些.支持的开发语言也比protobuf多些.目前只用过thrift.protobuf倒没有尝试...都差不多.参考技术Afastrpcprotobuf的一个全部开源... 查看详情

轻量级高性能rpc框架hrpc

HRPCHRPC是一款基于Netty和Zookeeper设计的轻量级高性能RPC框架。特性采用Protostuff序列化;高性能,负载均衡;支持服务的注册和订阅;支持同步及异步2种调用方式;长连接,自动重连;采用cglib动态代理;代码简答,易上手;支持S... 查看详情

分布式rpc框架性能大比拼

  https://github.com/grpc/grpchttp://colobu.com/2016/09/05/benchmarks-of-popular-rpc-frameworks/https://www.zhihu.com/question/30027669 查看详情

rpc

...治理的一些概念,那么与服务治理配套的必然会涉及到RPC框架。在当前互联网的大背景下,RPC的运用应该大家或多或少都有涉及,国内外的RPC框架也是百花齐放。那么各个RPC框架各自有什么特点,另外RPC的核心点又是哪些,我们... 查看详情

企业常用的rpc框架比较

RPC框架比较  语言协议服务治理社区机构Hessian多语言hessian(二进制)–不活跃CauchoThrift多语言thrift–活跃ApacheFinagleJava/Scala多协议支持活跃TwitterTChannel多语言thrift支持活跃UberDubboJava支持拓展支持停滞 查看详情

c#sqlsugar,hisql,freesqlorm框架全方位性能测试对比sqlserver性能测试

在2022年1月份本人做过一次sqlsugar,hisql,freesql三个框架的性能测试,上次主要是测的sqlserver下的常规插入(非bulkcopy的方式数据插入),hisql与目前比较流行的ORM框架性能测试对比时间已经过半年,这次我就测的更完整点测试方案如... 查看详情

服务化实战之dubbodubboxmotanthriftgrpc等rpc框架比较及选型(代码片段)

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

gprc基本介绍(代码片段)

...过程调用,是Google发布的一个高性能、通用的开源RPC框架,2.gRPC定义gRPC是一个现代的开源高性能RPC框架,可以在任何环境中运行。它可以高效地连接数据中心内和跨数据中心的服务,支持可插拔的负载平衡、跟踪... 查看详情

浅谈单元测试(代码片段)

...过一些尝试,写过一点文章:Maven和Gradle中配置单元测试框架SpockGroovy单元测试框架spock基础功能DemoGroovy单元测试框架spock数据驱动Demo人生苦短?试试Groovy进行单元测试使用WireMock进行更好的集成测试如何测试这个方法--功能篇如... 查看详情

高性能rpc框架cloudwego-kitex内外统一的开源实践

...沙龙圆满落幕,本期沙龙以《字节高性能开源微服务框架:CloudWeGo》为主题。在沙龙中,字节跳动字节跳动基础架构服务框架资深研发工程师杨芮,跟大家分享了《高性能RPC框架Kitex内外统一的开源实践》,本... 查看详情

性能测试工具locust和jmeter比较-及相关书籍下载

...性能测试工具。JMeter和Locust-简介JMeter是久经考验的性能框架之一,其第一个版本大约在20年前发布。它是用纯Java语言编写的。最初,JMeter开发用于执行Web和FTP应用程序的负载测试。但是,现在它允许测试几乎所有应用程序和协... 查看详情

腾讯推出高性能rpc开发框架(代码片段)

...447;👇Tars是基于名字服务使用Tars协议的高性能RPC开发框架,同时配套一体化的服务治理平台,帮助个人或者企业快速的以微服务的方式构建自己稳定可靠的分布式应用。Tars是将腾讯内部使用的微服务架构TAF(Total... 查看详情

NSArray 与 C Array 性能比较

】NSArray与CArray性能比较【英文标题】:NSArrayvsCArrayperformancecomparison【发布时间】:2013-07-1009:31:44【问题描述】:我最近一直在运行一个小型研究项目,研究与C数组相关的NSArray的顺序或随机访问性能。大多数测试用例都按照我的... 查看详情

从rpc到服务化框架设计

...微服务化,那么就需要RPC调用,因此本文梳理了从RPC基本框架协议到整个服务化框架体系建设中所包含的知识点,重点在于RPC框架和服务治理能力的梳理,本文定位于一个科普性质的文章,在于让大家了解一个全貌。一、RPC基本... 查看详情