通常rpc
通信組件都具備高性特性,由於大部分rpc
都是基於二進制和鏈接複用的特色,相對於HTTP
(2.0如下的版本)來講有着很大的性能優點,很是適合服務間通信交互。本文針對了dotnet core平臺上的一些rpc
組件進行性能測試,主要包括grpc
,Orleans
,xrpc
和netx
;其實平臺下的rcp
組件有不少,畢竟我的精力有限並無一一添加到測試裏面去;若是你們有興趣能夠參與進來https://github.com/IKende/dotnet-rpc-benchmark添加或優化測試代碼並提交相關PR。html
測試描述
爲了更好的體現實際應用的狀況,功能和網絡環境都會多樣性測試。調用測試是基於遠程對象或接口的方式操做,操做方法包括簡單和相對複雜的對象;測試的物理網絡環境包括10Gb和普通網絡1Gb.分別測試16,32,64,128和256等不一樣的請求併發並獲取相關的總請求量和秒併發值。git
測試工具
https://github.com/IKende/CodeBenchmarkDocgithub
測試物理環境
-
Client網絡
E3-1230v2 16g併發
-
Server工具
E5-2670v2 32gpost
-
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併發