您的位置:首頁 > 滾動 >

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

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

概述

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

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

結(jié)構(gòu)圖為了更加明確整體關(guān)系,進(jì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ò)組件會對連接建立一個Secsiom會話對象,封裝連接信息和相關(guān)操作

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

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

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

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

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

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

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

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

Actor模型

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

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

RPC

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

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

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

消息協(xié)議類型

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

Message 消息,無需應(yīng)答Request 請求,對應(yīng)一個Response應(yīng)答Response 應(yīng)答,對應(yīng)一個請求

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

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

None 客戶端與服務(wù)器(Gate)之間不需要轉(zhuǎn)發(fā)的消息。(注意這里不是修飾字符不是"None",而是""表示沒有)Actor 服務(wù)器內(nèi)網(wǎng)之間的消息ActorLocation 客戶端與服務(wù)器需要轉(zhuǎn)發(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 在消息名后面注明了消息類型,并在消息名上面注明了應(yīng)答包的消息類型,并且包含一個RpcId的字段,這些都必須的,表示這是個不需要轉(zhuǎn)發(fā)的、需要應(yīng)答的請求消息。而消息名前綴只是方便理解,起到注釋的作用:表示這是Client進(jìn)程發(fā)送給Gate服務(wù)器進(jìn)程的消息。G2C_LoginGate 同上,是上述C2G_LoginGate請求的應(yīng)答消息。Rpc調(diào)用過程

如圖所示,進(jìn)行Rpc調(diào)用時,生成一個新的RpcID并帶入請求包中,同時把調(diào)用信息存起來。對方應(yīng)答時,會把請求包的RpcID傳入到應(yīng)答包中。在收到消息時如果是Resp類型消息會調(diào)用OnResp方法,通過應(yīng)答包的RpcID取出RpcInfo,通過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會取消異步的阻塞,執(zhí)行await后面的語句,詳情見之前寫的文章 跳轉(zhuǎn)鏈接: C#異步編程

Actor模型實現(xiàn)

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

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

最近更新

国产愉拍精品视频手机| 国产精品亚洲二区在线| 亚洲精品人成无码中文毛片| 亚洲AV午夜福利精品一区二区| 内射精品无码中文字幕| 久久丝袜精品中文字幕| 久久国产精品99久久久久久牛牛| 精品乱码久久久久久久| 精品视频在线观看你懂的一区| 久久精品国产亚洲av水果派| 国产精品午夜小视频观看| 91精品久久久久久久久久| 久久久久无码精品| 国产精品亚洲精品爽爽| 国产香蕉免费精品视频| 久久九九99热这里只有精品| 国产精品99久久久久久董美香| 精品久久久久久无码人妻中文字幕 | 网友自拍区视频精品| 国自产精品手机在线观看视频| 国产精品资源在线| 国产精品麻豆高清在线观看| 亚洲国产精品自在在线观看 | 精品国产网红福利在线观看| 九九免费久久这里有精品23| 国产精品白丝AV在线观看播放 | 777亚洲精品乱码久久久久久 | 国产92成人精品视频免费| 久久精品人人爽人人爽快| 久久久久亚洲精品男人的天堂| 国产午夜久久精品| 精品国产精品久久一区免费式| 99在线精品视频在线观看| 久久精品无码午夜福利理论片 | 无码精品人妻一区二区三区AV| 思思99re66在线精品免费观看| 国产精品久久成人影院| 91亚洲精品视频| 99国产精品自在自在久久| 四虎国产成人永久精品免费| 久久精品国产96精品亚洲|