dotnet core各rpc组件的性能测试

通常rpc通信组件都具备高性特性,由于大部分rpc都是基于二进制和链接复用的特色,相对于HTTP(2.0如下的版本)来讲有着很大的性能优点,很是适合服务间通信交互。本文针对了dotnet core平台上的一些rpc组件进行性能测试,主要包括grpc,Orleans,xrpcnetx;其实平台下的rcp组件有不少,毕竟我的精力有限并无一一添加到测试里面去;若是你们有兴趣能够参与进来https://github.com/IKende/dotnet-rpc-benchmark添加或优化测试代码并提交相关PR。git

测试描述

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

测试工具

https://github.com/IKende/CodeBenchmarkDoc网络

测试物理环境

  • Client并发

    E3-1230v2 16g工具

  • Server性能

    E5-2670v2 32g测试

  • Network优化

    10Gb和1Gbui

  • Systemspa

    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并发

相关文章
相关标签/搜索