網路請求包經過網路層(技術系列綜述(一)
)被解析翻譯成程式自定義的訊息,之後被投遞到業務執行緒的執行緒訊息佇列(技術系列綜述(二)
)中。業務執行緒在佇列的另一端取出訊息,開始處理,這是本章要介紹的部分。業務處理部分:主要有會話類(session)和會話管理類(sessionmanager,常見該類為單例)。先給出類圖,後文詳細介紹:
一 sessionmanager的職責:
(1)繼承imsgthread(技術系列綜述(二)
),呼叫該類的start方法,啟動業務執行緒
(2)提供on_.../do_...方法(技術系列綜述(二)
),供其它執行緒向業務執行緒投遞訊息,以及訊息在業務執行緒的處理入口。
(3)主要的私有屬性是session類的容器物件。容器類的選型的依據,首先是查詢效能,之後是插入刪除的效能。
array:陣列下標為session物件的seesionid_(此處sessionid,不要理解為常見協議中的session欄位,可以理解為session物件的索引)。可以做到插入刪除(參考記憶體管理chunk分配演算法)查詢都在o(1)完成,缺點不能動態增大。同樣可以參考定長記憶體池的分配演算法,動態申請255個array為乙個chunk,所有chunk使用vector管理,各chunk中array編號遞增255,同樣可以達到增刪查o(1)的效率。
缺點:(1)sessionid_重複使用,加上訊息經過訊息佇列形成的處理延遲,可能造成下乙個session物件處理上乙個同樣sessionid的session物件遺留下來的訊息,實際使用中每個session物件有自己的狀態機,這種殘留的訊息危害並不大。(2)需要自己實現,對比map的o(logn),這點細微的效能提公升無任何意義(也就是減少了幾次整型之間的對比)。相比不需要自己額外實現的普通陣列還算有點實用價值。
vector:如果被插入的session的sessionid是遞增的,查詢可以做到折半查詢logn的效能,但隨機刪除造成的記憶體移動是o(n),無法接受。
map:以紅黑樹為基礎實現。增刪查詢的效能都可以平穩的保持在o(logn),sessionid_為整型或者其operater《實現簡單的時候是最常用的容器。
hash_map:雜湊表,使用大量記憶體盡量使資料均勻分布,查詢效能分hashcode的計算(hash函式)和查詢部分,hash函式一般為所有有效資訊的移位計算(經典的是字串的33演算法)疊加,查詢部分最理想的是0(1),最差是0(n),取決於hash函式計算結果碰撞的機率。當sessionid_為字串或者其operater《實現複雜的時候常用。
(4)該類處理訊息的方式舉例如下:(容器以mapmapsessions_為例)
do_msg_type_1_(msgdata
&msg)
else
如上例所示,session管理類對訊息的處理方式必須簡單固定,方便可持續維護、擴充。
二 session的職責
(1)資料結構:每一路連線的業務處理部分,首先有sessionid_標記session本身,其次包含業務處理需要的必須的資料部分,另外最重要的乙個資料結構就是狀態機了。
(2)狀態機。狀態機標識session物件的狀態,接收外部輸入的事件,驅動狀態機執行,並作出行為響應。詳細見《技術系列之 狀態機(一)》
和《技術系列之 狀態機(二)》
,不多說了。
(3)方法。主要分兩類:on_msg和do_event。舉例如下:
on_msg
&msg)
void
do_event..(eventdata
&event
)注意:1、所有有可能改變session內蘊狀態的操作都必須納入狀態機的嚴格控制,不能存在不通過狀態機即可改變session內蘊狀態的操作入口。
2、如果兩個狀態對同樣的事件做出同樣的反應,並且都遷移到相同的狀態,那麼這兩個是同乙個狀態。
3、盡可能減少狀態的個數。如果兩個狀態具有嚴格的時序關係,處理的事件不同並且有嚴格的時序關係,那麼考慮合併這兩個狀態,防止狀態機膨脹。
三 總結:
理解業務部分,先區分訊息(msg)和事件(event)。
1、訊息(msg):是指執行緒之間傳遞的資料結構,即被投遞到執行緒訊息佇列中的資料結構。sessionmanager主要職責是接收訊息,通過訊息對映,找到處理該訊息的函式,該函式根據訊息中攜帶的sessionid,找到session物件,呼叫該session的訊息處理函式繼續後續的處理。
2、事件(event):是指被session物件中的狀態機處理的資料結構。該資料結構,在session的訊息處理函式中通過訊息的內容拼湊,之後交給狀態機物件處理,狀態機物件根據事件型別,通過事件對映,找到處理該事件的函式,繼續該事件的處理。
3、**流程:一般情況下(邏輯控制部分)其它執行緒不能直接呼叫session物件,正確的呼叫方式是發訊息sessionmanager,sessionmanager根據訊息找到session物件再進行後續處理。
4、**要寫的足夠呆板。
寫出好的系統關鍵在於對業務的理解,不在於對**技巧的玩弄。
(本文首次發表於
QT伺服器搭建之 綜述
自己的乙個內部試驗系統 簡要記錄如下 系統環境要求 部署基本環境 jdk1.8,mysql 5.36,redis3.2,登入資料庫,建立qitai admin賬號,並執行初始化sql檔案 qitai init.sql 安裝必須的軟體 假設工作目錄 data jdk1.8安裝 安裝mysql 5.6....
online遊戲伺服器架構 綜述
到了新公司,初涉了遊戲程式設計,但是我關注的並不是遊戲的處理邏輯,而是遊戲伺服器的架構,摩爾莊園遊戲已經很流行了,它的網路處理邏輯並不是很特別,但是卻值得我花一些時間去體會,這幾篇文章就論述一下摩爾莊園online伺服器的架構,當然這裡並沒有洩露公司機密的意思,因此 都經過了我的處理,在可以不引用 ...
online遊戲伺服器架構 綜述
到了新公司,初涉了遊戲程式設計,但是我關注的並不是遊戲的處理邏輯,而是遊戲伺服器的架構,摩爾莊園遊戲已經很流行了,它的網路處理邏輯並不是很特別,但是卻值得我花一些時間去體會,這幾篇文章就論述一下摩爾莊園online伺服器的架構,當然這裡並沒有洩露公司機密的意思,因此 都經過了我的處理,在可以不引用 ...