-
互聯(lián)網(wǎng)安全法,互聯(lián)網(wǎng)凈網(wǎng)行動
-
”凈網(wǎng)2020”落實好維護網(wǎng)絡(luò)安全責任
-
關(guān)于端午節(jié)放假通知-宇眾網(wǎng)絡(luò)
-
宇眾網(wǎng)絡(luò)春節(jié)放假通知
-
關(guān)于公司收款銀行賬戶變更通知函-宇眾網(wǎng)絡(luò)
-
關(guān)于網(wǎng)上有人冒充我公司名義進行詐騙的公告。
-
關(guān)于端午節(jié)放假通知,節(jié)日放假,但是我們業(yè)務(wù)不“放假”-宇眾網(wǎng)絡(luò)
-
工信部進一步加強未備案網(wǎng)站管理工作的通知-宇眾網(wǎng)絡(luò)
-
關(guān)于東莞市宇眾網(wǎng)絡(luò)科技有限公司香港數(shù)據(jù)中心(香港機房)路由優(yōu)化通知
-
宇眾網(wǎng)絡(luò)慶祝五·一勞動節(jié)快樂
-
東莞東城機房網(wǎng)絡(luò)升級通知
-
臨近過年,互聯(lián)網(wǎng)IDC貴圈也有被騙的,請認準宇眾網(wǎng)絡(luò)公司官方聯(lián)系方式
-
我司已獲得ISP/ICP/IDC三證資格,更好的為客戶服務(wù)
-
關(guān)于浙江金華高防機房網(wǎng)絡(luò)線路切割通知
-
工信部近日下發(fā)關(guān)于進一步規(guī)范域名備案工作的通知
行業(yè)資訊
- 首頁
- 新聞中心
- 行業(yè)資訊
關(guān)于游戲服務(wù)器開發(fā)經(jīng)驗分享,157.119.28.1宇眾貴州BGP服務(wù)器游戲服務(wù)器的第一選擇!??!
游戲簡介
客戶端和服務(wù)器使用長連接. 游戲沒有分區(qū)的概念, 對玩家來說, 游戲只有一個區(qū), 所有玩家相互都可以進行互動. 玩家間的互動并不十分頻繁, 不存在mmorpg里需要廣播同屏玩家信息的情況. 客戶端向服務(wù)器請求數(shù)據(jù), 服務(wù)器一般不會主動向客戶端發(fā)送數(shù)據(jù).
系統(tǒng)架構(gòu)
服務(wù)器是一個分布式系統(tǒng), 整個系統(tǒng)由若干個獨立的服務(wù)器組成. 每個服務(wù)器是一個進程, 每個進程都可以根據(jù)需要部署在相同或不同的物理機上. 進程間用 socket 通訊. 所有的進程都在一個局域網(wǎng)中. 整個系統(tǒng)有以下幾種服務(wù)器組成(每種服務(wù)器都有若干臺), 1. 網(wǎng)關(guān)服務(wù)器, 2. 邏輯服務(wù)器. 3. 連接服務(wù)器, 4. 功能服務(wù)器, 5. 數(shù)據(jù)庫服務(wù)器. 下面逐一介紹.
1. 網(wǎng)關(guān)服務(wù)器
網(wǎng)關(guān)服務(wù)器, 客戶端和網(wǎng)關(guān)服務(wù)器連接, 對每一個連接的玩家, 網(wǎng)關(guān)服務(wù)器分別向游戲服務(wù)器建立一條獨立的連接. 網(wǎng)關(guān)服務(wù)器沒有任何邏輯處理, 它只負責建立連接和轉(zhuǎn)發(fā)消息. 網(wǎng)關(guān)服務(wù)器在搭建完成后, 基本不需要在做任何變化. 網(wǎng)關(guān)服務(wù)器有這幾個作用:
* 為游戲服務(wù)器組提供一個統(tǒng)一并且安全的接口, 供客戶端使用.
* 根據(jù)游戲負載, 游戲服務(wù)器的數(shù)量會增加或減少, 網(wǎng)關(guān)服務(wù)器向客戶端隔離了這個變化.
★如有服務(wù)器租用可咨詢宇眾臨風,QQ:2850293179 Tel:15999932452 服務(wù)器租用價格列表
2. 邏輯服務(wù)器
顧名思義, 邏輯服務(wù)器處理所有的玩家邏輯. 玩家通過一個簡單的 hash 算法, uid % logicServerNum, 分配到某一臺邏輯服務(wù)器上. 這臺服務(wù)器加載玩家數(shù)據(jù), 操作它們, 然后寫入數(shù)據(jù)庫. 邏輯服務(wù)器是多線程的, 包括網(wǎng)絡(luò)線程, 數(shù)據(jù)庫讀寫線程, 邏輯線程等等. 邏輯線程負責處理玩家發(fā)送的所有消息. 為了降低復(fù)雜度, 邏輯線程只有一個.
3. 連接服務(wù)器
假設(shè)玩家A和玩家B被分配到不同的邏輯服務(wù)器上, A要和B有互動, 就需要用到連接服務(wù)器. A把消息發(fā)送到連接服務(wù)器, 連接服務(wù)器把消息發(fā)送到B所在的邏輯服務(wù)器. B邏輯服務(wù)器處理完畢, 將消息返回給連接服務(wù)器, 連接服務(wù)器在把消息發(fā)給A邏輯服務(wù)器.
4. 功能服務(wù)器
功能服務(wù)器處理一些特殊功能, 這些功能通常需要用到全局數(shù)據(jù). 比如排行榜功能和公會功能.
5. 數(shù)據(jù)庫服務(wù)器
一個數(shù)據(jù)庫服務(wù)器實際上就是一個 ttserver 進程. ttserver是一個key-value數(shù)據(jù)庫. 可以根據(jù)啟動參數(shù)把數(shù)據(jù)保存在內(nèi)存, 或是硬盤. 數(shù)據(jù)庫服務(wù)器根據(jù)使用方式的不同, 分成這幾種:
* 內(nèi)存數(shù)據(jù)庫, 只把數(shù)據(jù)保存在內(nèi)存, 數(shù)據(jù)條目是有限的, 條目到達上限后, 老的數(shù)據(jù)會被刪除.
* 物理數(shù)據(jù)庫, 直接讀寫硬盤.
邏輯服務(wù)器讀數(shù)據(jù)時, 先從內(nèi)存數(shù)據(jù)庫讀, 如果沒有, 再從物理數(shù)據(jù)庫讀.
寫數(shù)據(jù)時, 先寫入內(nèi)存數(shù)據(jù)庫, 再寫入物理數(shù)據(jù)庫.
內(nèi)存數(shù)據(jù)庫的作用就是減少讀寫數(shù)據(jù)庫的時間.
網(wǎng)絡(luò)
除了數(shù)據(jù)庫服務(wù)器外, 其它的服務(wù)器的網(wǎng)絡(luò)層都是一樣的. 使用 epoll 做多路復(fù)用. 為每個socket fd 維護一個讀緩存和一個寫緩存.
邏輯線程向玩家發(fā)送數(shù)據(jù)時, 把數(shù)據(jù)放到寫緩存.
讀緩存里的數(shù)據(jù)夠一條完整的消息后, 取出這條消息, 放入消息隊列.
消息處理
用一個消息隊列來作為網(wǎng)絡(luò)線程和邏輯線程的溝通. 往這個隊列里pop和push消息時, 需要加鎖.
邏輯線程在一個循環(huán)里中消息隊列里pop出消息, 處理它.
---------------------------------------------------------------------------------------
以上簡單介紹了服務(wù)器的架構(gòu). 下面說說最近對寫代碼的一些體會.
避免動態(tài)內(nèi)存
雖然我們使用 tcmalloc 來做內(nèi)存分配, 還是應(yīng)該盡可能的避免動態(tài)申請內(nèi)存. 一方面可以提高代碼的運行速度, 更重要的是可以減少bug的產(chǎn)生.
一個比較好的方法是為某些對象建立內(nèi)存池.
慎重修改別人的代碼
程序員寫下的每行代碼都有他的理由, 如果沒有充分理解別人的意圖, 絕不要修改別人的代碼.
重構(gòu), 再重構(gòu)
開發(fā)常常是迭代進行的: 先寫出大概的框架, 再一遍一遍的逐步完善. 在迭代的過程中, 如果原來的設(shè)計有問題, 不能用 "打補丁" 的方式讓程序正常工作, 應(yīng)該重新設(shè)計. 只有這樣, 才能避免系統(tǒng)出現(xiàn) "壞味道". 最終完成一個簡潔一致的設(shè)計.
一次又一次的檢查自己的代碼
測試能夠發(fā)現(xiàn)的問題是有限的. 要想在功能上線之后能夠正確的運行, 做代碼審核是必須的, 如果可能的話, 同事之間互相來做審核. 如果只能自己審核自己的代碼的話, 有一個提高效率的小技巧: 自己寫的代碼思路記得越清楚, 越難看出問題. 代碼寫好后, 過幾天再審核, 思路淡了, 往往更能發(fā)現(xiàn)問題.
不要只審核一次就完事了. 如果有時間, 看第二次, 第三次.
慎用技巧
技巧是有副作用的, 最大的副作用就是增加的程序的復(fù)雜度, 復(fù)雜度越高的設(shè)計一定越容易出現(xiàn)問題, 同時以后維護起來也更難.
在效率要求不是那么高的時候, 簡單粗暴的設(shè)計往往更好.
先寫出一個簡單的設(shè)計, 再根據(jù)要求進行優(yōu)化. 簡單的設(shè)計更容易實現(xiàn)的正確. 把一個正確的系統(tǒng)修改得更快, 比把一個有問題的系統(tǒng)修改正確要容易得多.
消滅重復(fù)的代碼
★如有服務(wù)器租用可咨詢宇眾臨風,QQ:2850293179 Tel:15999932452 服務(wù)器租用價格列表
重復(fù)的代碼應(yīng)該用函數(shù)封裝起來. 相似但是有細微不同的邏輯, 是有問題的, 要想辦法重構(gòu).
在同一個工程里 復(fù)制 粘貼 代碼, 是在作踐自己的職業(yè).
系統(tǒng)運維
運維事故是大大的不應(yīng)該, 它們完全是可以避免的. 因為它們絕大多數(shù)是由于粗心導(dǎo)致的.
好的運維流程應(yīng)該是按部就班的進行. 使用提前設(shè)計好的腳本.
運維腳本可以用 shell 和 expect 來編寫. 應(yīng)該提前考慮好需要的腳本, 早早的準備好.
編寫功能之外的輔助代碼
完成一個功能后, 要考慮如何在功能上線后, 監(jiān)控它是否正常運行, 如果出現(xiàn)bug, 如何關(guān)閉功能, 如何修復(fù)錯誤的數(shù)據(jù), 如何重新上線... 為這些情況編寫功能之外的輔助代碼.
化繁為簡, 分而治之
編程其實就是把現(xiàn)實問題抽象成邏輯模型, 再用計算機語言來實現(xiàn)這個模型. 這個模型應(yīng)該是簡單而直觀的, 它的邊界條件和隱藏規(guī)則越少越好. 它可能又若干個模塊組成, 模塊之間必須是低耦合的. 每個模塊只完成一個簡單的任務(wù), 這個任務(wù)應(yīng)該能用一兩句話描述出來.