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