一般rpc
通訊組件都具有高性特性,因為大部分rpc
都是基於二進制和連接復用的特點,相對於HTTP
(2.0以下的版本)來說有着很大的性能優勢,非常適合服務間通訊交互。本文針對了dotnet core平台上的一些rpc
組件進行性能測試,主要包括grpc
,Orleans
,xrpc
和netx
;其實平台下的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並發