.net core高吞吐遠程方法如何調用組件XRPC詳解
前言
XRPC的目標非常明確,就是給.net core平臺實現(xiàn)一個百萬級別的遠程方法調用RPC通訊組件。它的設計理念和GRPC一樣,基于連接復用的機制實現(xiàn)高吞的性能;XRPC采用了HTTP2復用的思想,在協(xié)議設計上也類似文本和二進制相結合;在應用層面并沒使用消息而是基于接口代理的方式讓使用更簡便。
協(xié)議序列化
XRPC采用了基于文本+二進制相結合的通訊協(xié)議,頭以文本的方式表現(xiàn)主要是描述請求的位置和附加信息,這樣設計的好處就是在實現(xiàn)網(wǎng)關的時候只需要解釋頭部就能做很好的負載策略。二進制處理并沒有像GPRC一樣使 Protobuf,而是使用了在.net core平臺下相對更高效的組件MessagePack。
通訊機制
在早期很多RPC是基于獨享連和連接池的方式進行構建,這樣的好處就是實現(xiàn)起來方便簡單,但這種設計就無法把不同請求的請求混合到一個IO上。導致網(wǎng)絡IO隨并發(fā)消息的增長而增長,從而局限了性能的發(fā)揮。XRPC的設計是盡量在最少連接情況發(fā)揮更高效的網(wǎng)絡處理能力,這樣就可以把N個請求的數(shù)據(jù)復用在一個IO上,而從讓網(wǎng)絡利用率大大提升。
但這種設計的缺點就是使用起來非常復雜,不過在.NET提供async/await支持下整體設計和應用就變得相對簡單和清晰很多了?,F(xiàn)在模塊已經(jīng)完成基礎功能版本,以下介紹一下如何使用。
組件使用
組件現(xiàn)在只完成最基礎的功能,后面會引用Actor的一些基礎元素,讓在并發(fā)業(yè)務處理數(shù)據(jù)上更高效??梢酝ㄟ^Nuget引用組件
Install-Package BeetleX.XRPC -Version x
定義接口服務
XRPC是通過接口的方式來描述服務,通過接口制定相關服務的邏輯,具體實現(xiàn)如下:
[Controller(typeof(IUserService))] public class UserService : IUserService { public Task<User> Add(string name, string email, string city, string remark) { User user = new User(); user.Name = name; user.EMail = email; user.City = city; user.Remark = remark; return Task.FromResult(user); } public Task<List<User>> List(int count) { List<User> result = new List<User>(); for (int i = 0; i < count; i++) { User user = new User(); user.ID = Guid.NewGuid().ToString("N"); user.City = "GuangZhou"; user.EMail = "Henryfan@msn.com"; user.Name = "henryfan"; user.Remark = "http://ikende.com"; result.Add(user); } return Task.FromResult(result); } public bool Login(string name, string pwd) { return (name == "admin" && pwd == "123456"); } public User Modify(User user) { return user; } public void Save() { Console.WriteLine("user saved"); } }
啟動服務
class Program { private static XRPCServer mXRPCServer; static void Main(string[] args) { mXRPCServer = new XRPCServer(); //mXRPCServer.ServerOptions.DefaultListen.Port = 80; mXRPCServer.Register(typeof(Program).Assembly); mXRPCServer.Open(); Console.Read(); } }
通過Register注冊相關程序集,組件會把程序集中所有控制器加載到內存中,可以通過日志加載情況:
Client定義
client = new XRPCClient("localhost", 9090); client.Connect(); client.NetError = (c, e) => { Console.WriteLine(e.Error.Message); }; client.TimeOut = 10000;
定義一個XRPCClient對象來進行遠程訪問,對象默認最大連接數(shù)是2,也可以根據(jù)自己實情況進行調整,不建增加這樣會導致網(wǎng)絡IO也會增加影響整體性能。
var api = client.Create<IUserService>(); var lresult = await api.Login("admin", "123456"); Console.WriteLine(lresult); var result = await api.Add("henry", "henryfan@msn.com", "gz", "http://github.com"); Console.WriteLine($"{result.Name}\t{result.EMail}\t{result.City}\t{result.Remark}"); await api.Save(); Console.WriteLine("save completed"); User user = new User(); user.ID = Guid.NewGuid().ToString("N"); user.Name = "henry"; user.EMail = "henryfan@msn.com"; user.City = "GuangZhou"; user.Remark = "http://github.com/ikende"; result = await api.Modify(user); Console.WriteLine($"{result.Name}\t{result.EMail}\t{result.City}\t{result.Remark}"); var items = await api.List(5); foreach(var item in items) { Console.WriteLine($"{item.Name}\t{item.EMail}\t{item.City}\t{item.Remark}"); }
通過Create方法可以創(chuàng)建接口代理,這個代理是線程安全的,正常情況只需要創(chuàng)建一個靜態(tài)成員即可;創(chuàng)建接口后只需要調用相關方法即可完成遠程方法的調用。
基礎性能
組件設計的性能目標是百萬級別RPS的遠程方法調用,不過在一臺4核物機作為服務測試并沒有達到這個目標,不過測試結果還算比較理想,在以上示例代碼Login方法,采用500個并發(fā)模擬的情況RPS達到將近70萬。以下是不同方法在不同并發(fā)數(shù)下的測試結果。
詳細測試代碼:https://github.com/IKende/XRPC/tree/master/Samples/Performance
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。
相關文章
ASP.NET連接SQL數(shù)據(jù)庫的簡單實例代碼
這篇文章介紹了ASP.NET連接SQL數(shù)據(jù)庫的簡單實例代碼,有需要的朋友可以參考一下2013-07-07ASP.NET?Core?MVC中使用Tag?Helper組件
這篇文章介紹了ASP.NET?Core?MVC中使用Tag?Helper組件的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-02-02手把手教你AspNetCore WebApi數(shù)據(jù)驗證的實現(xiàn)
這篇文章主要介紹了手把手教你AspNetCore WebApi數(shù)據(jù)驗證的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10如何在?ASP.NET?Core?Web?API?中處理?Patch?請求
這篇文章主要介紹了在?ASP.NET?Core?Web?API中處理Patch請求,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05asp.net 實現(xiàn)自定義Hashtable (.net)
asp.net Hashtable自定義實現(xiàn)代碼,比較多,大家可以看下,測試。2009-06-06