一个色综合亚洲更新最快,被大鸡巴爆操的刺激视频,亚洲免费看黄片av大全,免费无码黄网站在线观看

您的位置:首頁(yè) > 滾動(dòng) >

ET框架6.0分析三、網(wǎng)絡(luò)通信_(tái)世界資訊

2023-05-15 17:17:40 來(lái)源:博客園

概述

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

ET框架消息結(jié)構(gòu)

結(jié)構(gòu)圖為了更加明確整體關(guān)系,進(jìn)行了一定程度的簡(jiǎn)化,剔除掉了一些消息解包等一些細(xì)節(jié)


(相關(guān)資料圖)

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

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

Channel對(duì)應(yīng)一個(gè)Session連接,封裝了對(duì)底層tcp等協(xié)議庫(kù)的操作。Service對(duì)應(yīng)一個(gè)NetCompent組件,對(duì)應(yīng)NetCompent管理多個(gè)Session,Server管理和調(diào)度一堆Channel的工作。

NetServices負(fù)責(zé)調(diào)度多個(gè)Service對(duì)象的在網(wǎng)絡(luò)線程和主線程工作任務(wù),ET開(kāi)了網(wǎng)絡(luò)線程處理網(wǎng)絡(luò)相關(guān),某些進(jìn)程需要多個(gè)網(wǎng)絡(luò)組件(比如Gate服務(wù)器同時(shí)需要Server、Inner網(wǎng)絡(luò)組件,接收轉(zhuǎn)發(fā)客戶端消息)。

NetComponentOnReadEvent是不同類型網(wǎng)絡(luò)組件的消息處理器。

NetClientComponentOnReadEvent對(duì)應(yīng)客戶端Client,處理普通消息和RPC調(diào)用。NetInnerComponentOnReadEvent對(duì)應(yīng)服務(wù)器內(nèi)網(wǎng)類型Inner,處理Actor消息NetServerComponentOnReadEvent對(duì)應(yīng)服務(wù)外網(wǎng),處理Actor消息、RPC調(diào)用、普通消息消息通信

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

如上述,ET開(kāi)了一個(gè)線程處理網(wǎng)絡(luò)相關(guān),一些工作使用了“生產(chǎn)-消費(fèi)”Task任務(wù)這種方式。使用了異步SocketTCP發(fā)消息TCP收消息多進(jìn)程調(diào)用

ET框架在基礎(chǔ)網(wǎng)絡(luò)消息通信基礎(chǔ)使用了Actor模型、PRC等相關(guān)技術(shù)思想(某些思想和實(shí)現(xiàn)有調(diào)整)進(jìn)行了拓展,提供多個(gè)進(jìn)程的互相調(diào)用機(jī)制。先對(duì)相關(guān)技術(shù)做一個(gè)簡(jiǎn)介:

Actor模型

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

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

RPC

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

RPC機(jī)制通過(guò)一些手段抹平了不同進(jìn)程的差異,使得進(jìn)程間的調(diào)用可以和本地異步調(diào)用一樣處理。

了解了這兩種技術(shù),下面來(lái)看ET框架對(duì)其的應(yīng)用和如何實(shí)現(xiàn)多進(jìn)程調(diào)用的。

消息協(xié)議類型

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

Message 消息,無(wú)需應(yīng)答Request 請(qǐng)求,對(duì)應(yīng)一個(gè)Response應(yīng)答Response 應(yīng)答,對(duì)應(yīng)一個(gè)請(qǐng)求

注意Request和Response一定成對(duì)定義,且其Message一定包含一個(gè)RpcId字段

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

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

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

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

如圖所示,進(jìn)行Rpc調(diào)用時(shí),生成一個(gè)新的RpcID并帶入請(qǐng)求包中,同時(shí)把調(diào)用信息存起來(lái)。對(duì)方應(yīng)答時(shí),會(huì)把請(qǐng)求包的RpcID傳入到應(yīng)答包中。在收到消息時(shí)如果是Resp類型消息會(huì)調(diào)用OnResp方法,通過(guò)應(yīng)答包的RpcID取出RpcInfo,通過(guò)RpcInfo取消調(diào)用RpcCall函數(shù)的異步阻塞。

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會(huì)取消異步的阻塞,執(zhí)行await后面的語(yǔ)句,詳情見(jiàn)之前寫的文章 跳轉(zhuǎn)鏈接: C#異步編程

Actor模型實(shí)現(xiàn)

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

參考鏈接跳轉(zhuǎn)鏈接: Actor模型介紹跳轉(zhuǎn)鏈接: RPC介紹

最近更新

泰和县| 安阳市| 高阳县| 孙吴县| 新巴尔虎左旗| 安阳县| 嵊州市| 游戏| 通城县| 天津市| 尼勒克县| 兴宁市| 子洲县| 延寿县| 峨眉山市| 长岭县| 含山县| 乐安县| 宿州市| 宁阳县| 临夏县| 荣昌县| 长宁县| 绥阳县| 耒阳市| 偏关县| 克山县| 定州市| 静海县| 和政县| 呼玛县| 碌曲县| 肥东县| 广元市| 河曲县| 天长市| 安义县| 德保县| 鹿邑县| 榆社县| 佛教|