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

您的位置:首頁 > 滾動 >

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

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

概述

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

ET框架消息結構

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


(相關資料圖)

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

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

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

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

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

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

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

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

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

Actor模型

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

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

RPC

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

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

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

消息協(xié)議類型

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

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

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

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

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

如圖所示,進行Rpc調(diào)用時,生成一個新的RpcID并帶入請求包中,同時把調(diào)用信息存起來。對方應答時,會把請求包的RpcID傳入到應答包中。在收到消息時如果是Resp類型消息會調(diào)用OnResp方法,通過應答包的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框架的設計中,Actor其實是一個帶有MailboxComponent的組件。其具體的實現(xiàn)方式,ET有比較詳細的文檔說明,有實現(xiàn)思路和使用方式的介紹,這里貼出來,不做贅述。跳轉(zhuǎn)鏈接: ET Actor模型 官方介紹

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

最近更新

宁南县| 保亭| 胶南市| 新宾| 偃师市| 阿合奇县| 星子县| 边坝县| 修水县| 二连浩特市| 金溪县| 吉水县| 庄浪县| 策勒县| 讷河市| 凤山市| 慈利县| 石泉县| 北票市| 高邮市| 鄱阳县| 沾化县| 平江县| 石狮市| 漠河县| 都江堰市| 黄山市| 宁晋县| 浠水县| 鄯善县| 晋中市| 徐汇区| 沙洋县| 界首市| 山西省| 曲水县| 新丰县| 姜堰市| 马山县| 军事| 金昌市|