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並發


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM