單一世界 3 簡單報文

2021-05-22 04:47:53 字數 2093 閱讀 8815

我們知道,報文在網路上的流轉主要是以二進位制方式傳輸,而報文具體的含義依賴於收發雙方的私有約定。而xml設計於一種通用標準,在業務上具有更廣泛的適用性,但其解析上有較高的複雜度,帶來效能損失。我們需要設計一種高效、簡單、更強業務描述能力的報文協議,顯然,在報文定義具體業務含義的內容是不可行的。我將這個報文協議命名為gest協議,全稱是a general 、 efficient 、****** transfer protocol。

第一,我們以資料庫、im、遊戲等佔大多數應用的報文為考察目標。我們會發現,所有的業務級資料通常可以分為2種結構,**與樹。**以資料庫為典型,c型別的結構也可以表述為只有乙個紀錄的表,而變數則退化為只有乙個欄位的**。而更複雜的,在**中巢狀**,實際上,也是樹的一種表達方式。

第二,我們要考慮如何表述**和樹。如何在報文中描述**以及內容相對比較簡單,只要在報文中包含每個欄位的名稱以及值的型別就可以,而**的紀錄則共享相同的字段定義。不過,還要考慮的是,如果在乙個報文中,包含多個**。樹的表述可以從**進行擴充套件,我們可以定義乙個特定的字段,指示子節點是乙個**,而該**的定義可以放在其他地方。如果乙個報文中包含了多顆樹,可以參考多個**的組織結構。由於乙個棵樹的定義包含了多個**,那麼資料儲存同樣按多個**儲存,通過外部關鍵字進行關聯。

第三,我們要考慮如何減少傳輸資訊。**的定義資訊是個不小的資料,包括欄位名,字段長度,字段型別資訊等。如果每次都傳輸這些資訊,會造成很大的網路傳輸負荷,因此需要提供一種方式,能夠通過標記查詢某個id的結構定義,從而為後續的傳輸來復用。這種方式在資料庫中不大好用,因為每次的結果集定義都不同,不過大多數的定義是固定的,比如魔獸世界,每個操作碼對應的報文結構是固定的。

第四,長度資訊在很多地方被用到,但大多數情況下,只要1到2個位元組,而不是4個位元組,因此7bits的壓縮方法將被使用。而象guid這些稀疏大值,用位圖的方式壓縮是個不錯的主意。2者的區別在於7bits適用於小值的情況,而位圖適用於稀疏大值的情況。

第四、採用壓縮流也是個減少傳輸量的手段,比如象jabberd那樣,支援壓縮xml流。協議本身不能對具體實現方式作出規定,因此,最多只能提供多種選擇項。由於報文的定義,提供了多個**拼接乙個報文的可能,為成組傳輸提供可能,能有效降低互動次數。

第五,由於所有的資料都是**化的,對資料的解析要簡單很多,跟xml相比要快很多。即使是巢狀的情況,解析出**資料後,也能很快還原出樹結構。

ges協議:

struct head{

uint16  magic  ;   //魔數

uint16  len ;        //整個報文長度

uint8   version ;   //報文版本

uint8   type ;      //報文型別

uint8   tcount ;   //**定義數量

uint8   flag ;       //標誌位

uint32  serial ;    //報文序列號

struct field{

uint16 type ;        //字段型別,數值,字元...

uint16 field_len ;   //字段值的長度

uint8 name_len ;   //欄位名稱長度

char name[256] ;  //名稱字串,變長

uint16 nest_index ;      //巢狀表的索引,type為巢狀時才有效

uint8   precise ;    //浮點精度

uint8   decimal ;   //小數點後幾位

struct table{

uint32    guid ;     //**定義的唯一標記

uint8  name_len ;  //名稱長度

char name[256] ;  //名稱

uint8    field_count ;//字段數量

struct field fields[256]   //字段定義

uint32  record_count ;  //記錄數

struct nest{

uint32  guid ;             //本身的唯一標記

uint32  key  ;            //巢狀表中的值

這個定義只是大體描述了gest的思路,具體定義將進一步在後續中描述。

單一世界 2 報文介面

報文在所有的cs架構中,是很重要的基礎。因此,在所有工作開展之前,有必要先對報文進行分析。作為乙個通用的伺服器,那麼他的報文格式必須受標準 約束,在靈活性跟可擴充套件性方便是很重要的考慮因素,而對具體的業務規則反而不能深入的介入。魔獸世界的報文具有他本身私有的業務規則,單一世界是為網遊戲 設計的,所...

單一世界架構初探之登入管理

現在我們進入實質性的 階段,首先是登入管理。單點登入,意味著,所有的請求都將被乙個ip處理。而海量請求,意味著所有的登入管理都會在乙個ip的完成,天啦,如果到了10m那是什麼概念。即 使1m s的處理速度,也要10s才能完成乙個登入管理,那我估計,這個應用早被人罵了體無完膚,當然,魔獸世界可能例外,...

單一世界架構初探之動態分割槽

靜態分割槽,讓每個伺服器負責特定區域,技術上相對簡單 而動態分割槽實際上更接近於集群技術,按照負載自動調整區域,但技術更加複雜。上面所論述的計算遷移就是為了討論動態分割槽做的準備。在 魔獸世界中,暴風城和閃金鎮是2個典型,暴風城是個主城,人多 地形複雜,而閃金鎮周圍都是森林,人也多是匆匆過客,除了少...