zoukankan      html  css  js  c++  java
  • 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并发

     
     
  • 相关阅读:
    OutputCache 缓存key的创建 CreateOutputCachedItemKey
    Asp.net Web Api源码调试
    asp.net mvc源码分析DefaultModelBinder 自定义的普通数据类型的绑定和验证
    Asp.net web Api源码分析HttpParameterBinding
    Asp.net web Api源码分析HttpRequestMessage的创建
    asp.net mvc源码分析ActionResult篇 RazorView.RenderView
    Asp.Net MVC 项目预编译 View
    Asp.net Web.config文件读取路径你真的清楚吗?
    asp.net 动态创建TextBox控件 如何加载状态信息
    asp.net mvc源码分析BeginForm方法 和ClientValidationEnabled 属性
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/11796496.html
Copyright © 2011-2022 走看看