dotnet core各rpc元件的效能測試
一般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", "[email protected]", "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 = "[email protected]", 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併發