色婷婷丁香精品亚洲69,国产999精品免费国产,操女生黄色视频,骚女啊啊啊啊啊啊啊啊啊

您的位置:首頁 > 滾動 >

ET框架6.0分析三、網絡通信_世界資訊

2023-05-15 17:17:40 來源:博客園

概述

ET框架的消息機制貫徹始終,包含Entity消息(Awake,Update ...),自定義(Customer)消息,網絡消息等。而ET系統(tǒng)的進程包含了客戶端、Gate等各種類型的服務器,進程包含各種服務器客戶端之間通過網絡消息進行通信進行工作。

ET框架消息結構

結構圖為了更加明確整體關系,進行了一定程度的簡化,剔除掉了一些消息解包等一些細節(jié)


(相關資料圖)

NetCompontent網絡組件有Client客戶端、Server服務器(Gate)、Inner內網服務等多態(tài),進程業(yè)務使用網絡組件進行通信,網絡組件會對連接建立一個Secsiom會話對象,封裝連接信息和相關操作

Service和Channel實現(xiàn)負責NetCompontent和Session的功能,有Tcp長連接、Web網頁、KCP無連接可靠協(xié)議的多態(tài)(若不熟悉KCP協(xié)議,可以參考之前寫的文章 跳轉鏈接: KCP協(xié)議淺析)。

Channel對應一個Session連接,封裝了對底層tcp等協(xié)議庫的操作。Service對應一個NetCompent組件,對應NetCompent管理多個Session,Server管理和調度一堆Channel的工作。

NetServices負責調度多個Service對象的在網絡線程和主線程工作任務,ET開了網絡線程處理網絡相關,某些進程需要多個網絡組件(比如Gate服務器同時需要Server、Inner網絡組件,接收轉發(fā)客戶端消息)。

NetComponentOnReadEvent是不同類型網絡組件的消息處理器。

NetClientComponentOnReadEvent對應客戶端Client,處理普通消息和RPC調用。NetInnerComponentOnReadEvent對應服務器內網類型Inner,處理Actor消息NetServerComponentOnReadEvent對應服務外網,處理Actor消息、RPC調用、普通消息消息通信

以典型的TCP協(xié)議類型為例,其他實現(xiàn)類似,看圖相信都能理解,不多贅述。有一些要注意的點:

如上述,ET開了一個線程處理網絡相關,一些工作使用了“生產-消費”Task任務這種方式。使用了異步SocketTCP發(fā)消息TCP收消息多進程調用

ET框架在基礎網絡消息通信基礎使用了Actor模型、PRC等相關技術思想(某些思想和實現(xiàn)有調整)進行了拓展,提供多個進程的互相調用機制。先對相關技術做一個簡介:

Actor模型

在計算機科學中,Actor模型(Actor model)是一種并發(fā)運算上的模型?!癆ctor”是一種程序上的抽象概念,被視為并發(fā)運算的基本單元:當一個Actor接收到一則消息,它可以做出一些決策、創(chuàng)建更多的Actor、發(fā)送更多的消息、決定要如何回答接下來的消息。Actor可以修改它們自己的私有狀態(tài),但是只能通過消息間接的相互影響(避免了基于鎖的同步)

這是維基百科中對于Actor模型的描述,簡單理解它就是提供了一種消息機制避免了基于鎖的同步。一些經典的應用場景是多線程,在ET框架中它的應用場景是多進程,類似的它提供了一種機制:直接通過ID發(fā)消息,不用關心實例在哪個進程。

RPC

分布式計算中,遠程過程調用(英語:Remote Procedure Call,RPC)是一個計算機通信協(xié)議。該協(xié)議允許運行于一臺計算機的程序調用另一個地址空間(通常為一個開放網絡的一臺計算機)的子程序,而程序員就像調用本地程序一樣,無需額外地為這個交互作用編程(無需關注細節(jié))。RPC是一種服務器-客戶端(Client/Server)模式,經典實現(xiàn)是一個通過發(fā)送請求-接受回應進行信息交互的系統(tǒng)

RPC機制通過一些手段抹平了不同進程的差異,使得進程間的調用可以和本地異步調用一樣處理。

了解了這兩種技術,下面來看ET框架對其的應用和如何實現(xiàn)多進程調用的。

消息協(xié)議類型

如上圖所示消息類型分為三種:

Message 消息,無需應答Request 請求,對應一個Response應答Response 應答,對應一個請求

注意Request和Response一定成對定義,且其Message一定包含一個RpcId字段

消息類型可以被前綴修飾,修飾有三種:

None 客戶端與服務器(Gate)之間不需要轉發(fā)的消息。(注意這里不是修飾字符不是"None",而是""表示沒有)Actor 服務器內網之間的消息ActorLocation 客戶端與服務器需要轉發(fā)的消息。

修飾字符可以修飾任意消息類型,組合起來一共有9種消息。如這個登錄到Gate的協(xié)議:

//ResponseType G2C_LoginGatemessage C2G_LoginGate // IRequest{int32 RpcId = 1;int64 Key = 2;  // 帳號int64 GateId = 3;}message G2C_LoginGate // IResponse{int32 RpcId = 1;int32 Error = 2;string Message = 3;int64 PlayerId = 4;}
C2G_LoginGate 在消息名后面注明了消息類型,并在消息名上面注明了應答包的消息類型,并且包含一個RpcId的字段,這些都必須的,表示這是個不需要轉發(fā)的、需要應答的請求消息。而消息名前綴只是方便理解,起到注釋的作用:表示這是Client進程發(fā)送給Gate服務器進程的消息。G2C_LoginGate 同上,是上述C2G_LoginGate請求的應答消息。Rpc調用過程

如圖所示,進行Rpc調用時,生成一個新的RpcID并帶入請求包中,同時把調用信息存起來。對方應答時,會把請求包的RpcID傳入到應答包中。在收到消息時如果是Resp類型消息會調用OnResp方法,通過應答包的RpcID取出RpcInfo,通過RpcInfo取消調用RpcCall函數的異步阻塞。

public static void OnResponse(this Session self, IResponse response){if (!self.requestCallbacks.TryGetValue(response.RpcId, out var action)){return;}self.requestCallbacks.Remove(response.RpcId);if (ErrorCore.IsRpcNeedThrowException(response.Error)){action.Tcs.SetException(new Exception($"Rpc error, request: {action.Request} response: {response}"));return;}action.Tcs.SetResult(response);}

action.Tcs.SetResult會取消異步的阻塞,執(zhí)行await后面的語句,詳情見之前寫的文章 跳轉鏈接: C#異步編程

Actor模型實現(xiàn)

在ET框架的設計中,Actor其實是一個帶有MailboxComponent的組件。其具體的實現(xiàn)方式,ET有比較詳細的文檔說明,有實現(xiàn)思路和使用方式的介紹,這里貼出來,不做贅述。跳轉鏈接: ET Actor模型 官方介紹

參考鏈接跳轉鏈接: Actor模型介紹跳轉鏈接: RPC介紹

最近更新

荆门市| 青川县| 象州县| 泽库县| 泾川县| 广宁县| 沙湾县| 郑州市| 焉耆| 九龙城区| 大埔县| 衡南县| 库尔勒市| 延寿县| 巴东县| 界首市| 招远市| 钟山县| 东兴市| 望城县| 齐齐哈尔市| 江永县| 揭西县| 盘山县| 库车县| 鹤壁市| 龙泉市| 榕江县| 连州市| 会宁县| 沙洋县| 长治市| 富蕴县| 嵊州市| 绥阳县| 白沙| 航空| 手机| 松原市| 临邑县| 黑龙江省|