• rpc通讯


    dotnet core各rpc组件的性能测试

    一般rpc通讯组件都具有高性特性,因为大部分rpc都是基于二进制和连接复用的特点,相对于HTTP(2.0以下的版本)来说有着很大的性能优势,非常适合服务间通讯交互。本文针对了dotnet core平台上的一些rpc组件进行性能测试,主要包括grpc,Orleans,xrpcnetx;其实平台下的rcp组件有很多,毕竟个人精力有限并没有一一添加到测试里面去;如果大家有兴趣可以参与进来https://github.com/IKende/dotnet-rpc-benchmark添加或优化测试代码并提交相关PR。

    测试描述

    为了更好的体现实际应用的情况,功能和网络环境都会多样性测试。调用测试是基于远程对象或接口的方式操作,操作方法包括简单和相对复杂的对象;测试的物理网络环境包括10Gb和普通网络1Gb.分别测试16,32,64,128和256等不同的请求并发并获取相关的总请求量和秒并发值。

    测试工具

    https://github.com/IKende/CodeBenchmarkDoc

    测试物理环境

    • Client

      E3-1230v2 16g

    • Server

      E5-2670v2 32g

    • Network

      10Gb和1Gb

    • System

      Windows server

    测试接口描述

    复制代码
        public interface IGreeter
        {
            Task<HelloReply> SayHello(HelloRequest request);
    
            Task<User> Register(string name, string email, string password, string title, string city);
    
            Task<List<User>> List(int count);
    
        }
    复制代码

    Hello

    client request

    SayHello(new HelloRequest { Name = "you" });

    server response

    return new HelloReply { Message = "Hello " + request.Name };

    Register

    client request

    Greeter.Register("henryfan", "henryfan@msn.com", "12345678", "cxo", "guangzhou");

    server response

    复制代码
                return Task.FromResult(new User
                {
                    Name = name,
                    Email = email,
                    Password = password,
                    Title = title,
                    City = city,
                    CreateTime = DateTime.Now,
                    ID= Guid.NewGuid().ToString("N")
                });
    复制代码

    List

    client request

    Greeter.List(10);

    server response

    复制代码
                List<User> items = new List<User>(count);
                for(int i=0;i<count;i++)
                {
                    var item = new User {
                        Name = "henryfan",
                        City = "guangzhou",
                        Email = "henryfan@msn.com",
                        Title = "cxo",
                        Password = "12345678",
                        ID = Guid.NewGuid().ToString("N"),
                        CreateTime = DateTime.Now
                    };
                    items.Add(item);
                }
    复制代码

    测试总结

    因为测试结果的图比较多,就在这里先总结了,有兴趣的朋友看完总结后再细看结果(本总结只针对现有测试的组件)。

    • orleans

      严格来说orleans的功能其实已经超出一rpc的范围,因为它有集群和Actor等应用集成;作为rpc来说它使用简单,基础性能也并不差,如果不考虑多平台交互只是在.net中使用我个人感觉它是首选。缺点没有提供多平台支持,如果需要更高密集的通讯调用在性能上还是相对差了些。

    • grpc

      作为http2.0和protobuf的结合体有着多平台的通用性,如果你的系统是多环境集成那这个绝对是不二的选择了;不过官方提供的.net实现性能并不出色可以说有点强差人意,官方建议使用.net core 3.0作为基础通讯支持,由于这次测试是基于.net core 2.2 因此测试结果比较差。在使用上也要吐槽一下,proto描述时不支持基础类型的返回值和参数,所有接口方法参数和返回都必须定义message.

    • xrpc

      高吞吐、易用和支持actor是它的特点,可以轻松应对Gb级以上带宽的rpc请求处理,缺点并不提供多语言平台支持……如果应用需要在服务间进行高密集的通讯交互可以考虑。

    10Gb网络测试结果

    16并发

    32并发

    64并发

    128并发

     

    256并发

    1Gb网络测试结果

    16并发

    32并发

    64并发

    128并发

    256并发

     
     
  • 相关阅读:
    概率-期望粗学
    2*2右脚相反矩阵构造 2019牛客暑期多校训练营(第八场)
    Codeforces Round #530 (Div. 2)F Cookies (树形dp+线段树)
    E. Arson In Berland Forest(思维,找二维阵列中的矩阵,二分)
    Codeforces Round #523 (Div. 2) Cdp
    凸包
    E
    G. Petya and Graph(经典项目与项目消耗问题)(网络流)
    Educational Codeforces Round 55 (Rated for Div. 2)E
    hdu 3501 Calculation 2 (欧拉函数的扩展)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/11796496.html
Copyright © 2020-2023  润新知