`
m635674608
  • 浏览: 5044110 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    Hadoop自己的Rpc框架使用Demo

    此外,RPC框架还支持异步调用,可以在处理大量并发请求时提供更好的性能。 总结来说,Hadoop的RPC框架为开发者提供了一种简单而强大的方式来实现跨进程通信。通过上述步骤,你可以轻松地在自己的项目中集成和使用...

    可参考的自定义实现rpc框架

    下面将详细讨论RPC框架的基本概念、组成部分以及可能的实现方式。 首先,理解RPC的核心概念是至关重要的。RPC是一种通信协议,它使得客户端应用可以调用服务器端应用的方法,就像调用本地方法一样,无需关心网络...

    40_如何设计一个类似dubbo的rpc框架?架构上该如何考虑?.zip

    1. **理解RPC原理**:首先,要构建RPC框架,需要深入理解RPC的基本概念。RPC允许一个程序调用另一个程序,即使这个程序可能位于不同的机器上。这个过程涉及请求的序列化、网络传输、反序列化和调用响应处理。 2. **...

    Dubbo RPC框架原理解析和源码

    Dubbo是一款由阿里巴巴开源的高性能Java RPC框架,它在分布式系统中起到了服务调用的核心作用。RPC(Remote Procedure Call)允许一个程序调用另一个在不同网络计算机上的程序,就像调用本地函数一样简单。Dubbo的...

    RPC-DDSF:一种基于RPC的分布式数据共享框架.pdf

    文章进一步分析了在ONC RPC框架中影响数据共享性能的因素,并通过实验探究了不同参数设置下的ONC RPC性能表现。这些实验结果为框架的使用者提供了重要的指导信息,帮助他们在使用RPC-DDSF框架时能够调整参数以达到...

    基于Netty重构RPC框架.rar

    1. **设计原则**:如何根据RPC的基本原理,结合Netty的特点,设计出高效的RPC框架架构。 2. **协议设计**:定义RPC调用的请求和响应格式,可能涉及到HTTP、TCP/IP或者其他自定义的二进制协议。 3. **序列化与反...

    simple-rpc是一款基于netty的RPC框架

    **简单RPC:基于Netty的高效RPC框架** `Simple-RPC`是一个专为Java开发者设计的轻量级RPC(远程过程调用)框架,它利用了高性能的网络库`Netty`来实现实时、高效的远程通信。RPC框架在分布式系统中起到了关键作用,...

    JavaRPC框架

    在给定的“Java RPC框架”中,我们可以看到它是基于Netty实现的,Netty是一个高性能、异步事件驱动的网络应用程序框架,适用于开发高度可定制和高效率的服务端与客户端应用。 首先,让我们深入了解Java RPC框架的...

    RPC调用框架比较分析

    本篇文章将对几种常见的RPC框架进行比较分析,包括Protobuf RPC、Avro和Thrift,探讨它们的特点、优缺点以及适用场景。 1. Protobuf RPC(Protocol Buffers Remote Procedure Call) - **Protobuf** 是Google开发...

    TARS-PHP:PHP构建高性能RPC框架

    ### TARS-PHP:PHP构建高性能RPC框架 #### 一、引言 随着微服务架构在互联网领域的广泛应用,RPC(Remote Procedure Call,远程过程调用)框架成为了连接各个微服务的重要桥梁。TARS-PHP正是在这样的背景下应运而生...

    使用netty自定义rpc通信框架

    - `rpc_jar_test`:可能是一个独立的JAR测试项目,用于验证RPC框架的功能和性能。 综上所述,"使用netty自定义rpc通信框架"项目结合了Netty的强大网络编程能力,实现了高效、可靠的RPC通信。通过阅读和学习这个项目...

    极简的Vertx/Kotlin RPC框架

    【标题】"极简的Vertx/Kotlin RPC框架"揭示了这个项目的核心是构建一个基于Vert.x和Kotlin的轻量级远程过程调用(RPC)框架,它旨在简化跨服务间的通信,尤其是在微服务架构中。Vert.x是一个用于构建反应式应用的...

    Zookeeper实现简单的分布式RPC框架

    例如,在开发和测试阶段,我们可以使用像Postman这样的API测试工具来模拟客户端发送请求,验证RPC框架的功能是否正常。对于性能监控,可以借助JProfiler或者VisualVM等工具,分析内存使用、线程状态和CPU消耗,确保...

    jsonrpc-frontend:前端应用程序发送 json-rpc 请求进行测试

    3. **测试驱动**:jsonrpc-frontend工具提供的测试框架有助于确保前端与后端的接口正确工作。 4. **可调试性**:通过工具,开发者可以轻松追踪和调试请求与响应,有助于问题定位和解决。 5. **性能评估**:测试期间...

    基于netty轻量的高性能分布式RPC服务框架.zip

    对构建的RPC框架进行压力测试,评估性能瓶颈,可能的优化点包括缓存策略、线程池配置、序列化算法选择等。 在"java0323"这个文件夹中,可能会包含实现这些概念的源代码,例如服务提供者和服务消费者的相关类、...

    Netty Rpc框架

    Netty Rpc框架是一种基于Java的高性能网络通信库——Netty实现的远程过程调用(RPC)框架。Netty以其高效、稳定和灵活的设计在Java世界中广受赞誉,而Netty Rpc则是利用Netty的强大能力,构建了一种使得分布式系统间...

    Java框架JSON-RPC项目demo代码实战

    在Java开发中,JSON-RPC框架可以帮助开发者实现客户端与服务器之间的高效通信,常用于分布式系统或者微服务架构。本项目实战主要基于JSON-RPC进行,我们将探讨如何使用Java实现一个简单的JSON-RPC服务端和客户端。 ...

    RPC 轻量级框架高并发处理

    在提供的压缩包文件名称列表中,"test"可能是测试代码或测试数据,"rpc-simple"可能是简单的RPC实现示例,而"rpc"可能是完整的RPC框架源代码。这些文件可以帮助我们进一步理解RPC框架的工作原理和使用方法,但具体的...

    Netty4.1实战-手写RPC框架.pdf

    通过以上章节的学习,我们不仅了解了RPC的基本概念和工作原理,还掌握了如何基于Netty 4.1版本构建一个简易的RPC框架。这对于实际工作中遇到的服务间通信问题提供了有效的解决方案思路。未来还可以进一步探索更多...

    从零开始手写 dubbo rpc 框架-11-fail失败策略.pdf

    Dubbo 是阿里巴巴开源的一款高性能、轻量级的Java RPC框架,它提供了丰富的功能,如服务注册与发现、负载均衡、容错机制等。本篇将介绍如何从零开始构建一个简单的RPC框架,并关注其中的失败策略。 首先,RPC框架的...

Global site tag (gtag.js) - Google Analytics