1. 程式人生 > >H5遊戲開發的架構總結(二) 伺服器端

H5遊戲開發的架構總結(二) 伺服器端

【伺服器端】
1.關於Go語言
我們的H5遊戲伺服器框架是用Go語言開發的。以前做頁遊的時候是用的php和python,都是動態語言。在上線之後,高併發的時候,單機有效能問題,一直沒有好的解決辦法!
13年的時候我原來的領導開始轉用Go來開發手遊的伺服器端,所以我也跟著轉型了!
正如七牛的許世偉所說,用go開發,是可以降低程式設計師心智負擔的!靜態編譯的優點不用贅述,語言簡潔,開發效率高,特別是goroutine和chanel兩大神器,專治各種疑難雜症。
Go語言這兩年的發展非常迅猛,特別是在中國的很多重量級網際網路公司得到大量運用。
而且語言本身已經發展到1.6版本,GC時間從原來飽受詬病的幾秒下降到了1毫秒,除非是對延遲要求非常苛刻的應用場景,絕大部分的應用場景都能hold住!

2.關於通訊協議
我們這套框架,最開始是手遊的遊戲伺服器。所以只支援tcp socket。
後來轉H5之後,又加入了對websocket協議的支援,兩者放在一起,做了封裝。
後來為了相容不支援websocket協議的android手機,又加入了對http協議的支援,因為http屬於應用層協議,tcp是傳輸層協議,沒法簡單的封裝在一起,所以就寫了兩套。
但是傳送和接受的內容都是一樣的:加密之後的自定義格式的二進位制資料。


3.關於快取和資料庫
我們的資料庫用的是mysql,快取同時支援memcache和redis。
在業務層和資料庫之間,封裝了一層k-v的cache,可以通過配置分別使用memcache或者redis。
每張資料表都有自增長的id主鍵,並且有一個類似java bean的struct與之相對應.
針對單表的sql操作,根據型別不同有不同的處理機制:
1)select操作就根據id去快取裡面取值,沒有就查mysql,然後快取結果.
2)update/insert/delete操作,就直接操作mysql,同時刪除對應快取.

如果是對多表的聯合查詢,一般都是直接走sql,不走快取。

這樣就可以在高併發的時候,減輕資料庫的訪問壓力。
目前是隻用到一個主庫。後期壓力上來可以改成1主多從。


4.關於單元測試
Go語言對單元測試的原生支援,讓測試驅動開發成為一種本能!
但是單元測試也有不同的重量級,有的功能需要依賴專案啟動時讀取的配置檔案,有的功能還需要玩家的特殊狀態。
再加上多人協作開發的時候,需要控制每個人的私有單元測試邊界和公用的單元測試範圍,免得互相影響,因為引入不必要的測試而導致測試總時長增加!
在專案開始的時候,強調單元測試的重要性,並做好整個專案的單元測試的組織規劃和部署,非常重要,可以事半功倍,節省大量後期測試和糾錯的時間!


5.關於excel工具鏈
策劃的數值表都是excel,我們用go寫了個轉換工具可以通過命令列把指定的excel轉成伺服器端需要的json格式檔案。
其中有些json檔案的內容是客戶端需要的,於是又用python寫了個轉換指令碼,提取和組合伺服器端的json檔案內容,生成客戶端需要的json格式檔案。
有了這兩個工具,就可以實現自動化部署,方便測試在單獨的資料測試服上調資料!


6.關於伺服器端AI
碰碰車的聯網比賽場裡的AI行為比客戶端複雜,策劃在AI行為資料表裡進行配置,轉成json,在比賽場里根據AI配置檔案控制NPC的行為。
將計算之後的NPC的位置和角度等狀態傳送給客戶端,客戶端只負責呈現!


7.關於聯網糾偏
碰碰車的聯網比賽,伺服器端在房間裡會模擬客戶端的幀update事件,更新頻率在80毫秒一次。
每次update的時候都需要計算房間內所有agent的位置,進行碰撞檢測,以及其他邏輯。並把更新後的資訊,通過糾偏事件下行給所有玩家。
這個更新頻率太短和太長都不好。太短會造成伺服器和客戶端CPU壓力太大和網路流量的增加,太長會造成客戶端收到的位置和自身計算的位置差距太大,
如果不做線性補償,直接以伺服器端為準進行更新,會有跳躍感。


8.關於微服務和全球統一服
我們一開始做這套遊戲框架的目標就是支援高併發的全球統一服。
單機的效能再怎麼優化都有天花板,微服務和容器雲是目前互聯公司應對類似需求場景的通用解決方案!
按計劃分三步走:
第一步:單塊系統,通過命令列來打包和釋出。目前已在線上執行!
第二步:通過docker建立容器,實現自動化打包和釋出。目前已經在本地mac實現docker建立容器和執行測試,還沒有部署到線上!
第三步:進行微服務拆分,通過docker容器雲實現動態擴容,支援高併發,實現全球統一服。


9.關於服務監測
go是靜態語言,所以編譯執行的web應用如果出現panic,整個程序就退出了,所有連線都會被斷開。
這跟php這種動態語言提供的web應用還不太一樣,一個連線的服務掛了,其他連線不受影響。
所以必須充分的測試,儘量做到線上的服務不要panic。但是人難免會犯錯,程式也不可能百分百沒有bug,所以必須做好監控和預防措施!
我們的解決方案是有個定時程式每分鐘檢查一次伺服器程式的程序是否還在,如果沒有就說明程式panic了,就重啟伺服器應用,將影響降至最低。
同時郵件通知相關技術。技術收到郵件之後可以通過日誌檢視panic的原因,解決bug之後,測試通過,再發布更新!


10.關於壓力測試
1)測併發連結數上限,並以此為參考,設定登入排隊系統的人數限制!
2)測比賽場的玩家數上限,這個需要提前準備足夠的AI玩家資料,然後同時進入指定比賽場,
   一是看自動分房間功能是否正常,而是看有沒有併發死鎖和chanel掛起等問題發生。這些問題在開發的時候,本地單元測試是發現不了的!


相關推薦

H5遊戲開發架構總結() 伺服器

【伺服器端】 1.關於Go語言 我們的H5遊戲伺服器框架是用Go語言開發的。以前做頁遊的時候是用的php和python,都是動態語言。在上線之後,高併發的時候,單機有效能問題,一直沒有好的解決辦法! 13年的時候我原來的領導開始轉用Go來開發手遊的伺服器端,所以我也跟著轉型

H5遊戲開發程式碼總結

<span style="font-family: Arial, sans-serif; background-color: rgb(255, 255, 255);">1.移動端頁面佈局,使用相對的數值,不要使用絕對數值,推薦使用%,vw,vh,rem,em&

H5遊戲開發架構總結(一) 客戶

【客戶端】 1.關於遊戲引擎 在15年3月開始準備做h5遊戲的時候,首先遇到的問題就是引擎選型的問題。 當時市面上的2d引擎主要有3個:白鷺egret,layabox和cocos2d-js。 一方面,是因為我以前用cocos2d-x(c++)做了一年多的手遊客戶端,所以,很

遊戲開發入門(十遊戲開發總結

通過遊戲開發入門系列的學習,是不是對遊戲開發有了一個比較清晰的認識? 在最後一篇裡面,博主試著概括性的對遊戲開發做一個總結,歡迎各位提出意見來完善這篇部落格~ 遊戲模組總結: 遊戲邏輯模組系統:各種武器,狀態,技能,揹包,戰鬥等邏輯系統 動畫模組系

使用flask開發RESTful架構的api伺服器(5)–部署flask應用到nginx

nginx:一個高效能的http和反向代理伺服器,在高併發方面有良好的表現; wsgi:全稱是web server gateway interface,它是伺服器程式和應用程式之間的一個約定,它規定了兩者各實現什麼功能,以便它們能夠配合使用,作為中介軟體粘合伺服器程式和應用程式; gunicorn:一個開源

使用flask開發RESTful架構的api伺服器(3)–簡單的RESTful services

學生資訊資源為: 資源名稱 資源型別 學生號 int 姓名 str 年齡 int 籍貫 str 平均分 float 第一步先將資料儲存在記憶體中,使用資料庫進行資訊儲存在之後章節再繼續介紹; 1、建立flask伺服器 首先與第二章的用例相同建立一個flask的伺服器:

使用flask開發RESTful架構的api伺服器(2)–flask的安裝和使用

flask是一個純python的web應用框架,使用python安裝工具pip可以很方便的進行安裝,如果開發環境中已經有了pip工具,那麼可以迅速的安裝完flask,如果沒有最好去安裝一下,事先做好準備將來安裝其它python工具時都會節省下大量的時間,關於pip的安裝方法這裡就不介紹了,百度裡有非常多的介

使用flask開發RESTful架構的api伺服器(4)–flask操作資料庫

flask有一個對資料庫的擴充套件flask-sqlalchemy,它簡化了在flask中對sqlalchemy的操作,sqlalchemy是一個強大的關係資料庫框架,支援一些資料庫後端,提供高階的ORM和底層訪問資料庫的本地sql功能; 使用pip來安裝flask-sqlalchemy

使用flask開發RESTful架構的api伺服器(1)–什麼是RESTful和為什麼選擇flask

一、什麼是RESTful 最近需要開發一個使用RESTful架構的後臺api程式,什麼叫RESTful呢,REST的全稱是representational state transfer表徵狀態轉移,但其實這個全稱也不夠完整,它還缺少了主語,什麼的表徵狀態轉移呢,資源(resources)的; 資源(reso

使用flask開發RESTful架構的api伺服器–部署flask應用到nginx

原文地址:http://www.mrhaoting.com/?p=199 通過前幾章的介紹,大概瞭解了怎樣利用flask框架來開發服務端後端,但flask只是一個web框架,提供使用者便捷的開發方式,它並不是一個真正的web伺服器程式,想要這個服務端應用能夠支援高併發、

H5遊戲開發技術的發展進程

android 遊戲開發 pc瀏覽器 編程語言 遊戲平臺 首先,手機上最常用的兩個瀏覽器Android Chrome和iOS Safari默認支持WebGL。隨著這一飛躍式地發展,PC瀏覽器和手機都支持硬件圖形加速,而這是Web成為可行性遊戲平臺的必要條件。同時,這也使Flash、Silv

dubbo學習總結 服務

技術 進行 ati 學習 ace upload bsp 配置文件 .cn 服務端主要執行對底層數據庫的操作 主要分層為 api +dao+ filter+ util+... 首先 dubbo 服務端有一個dubbo配置文件 dubbo:application 定義

微信H5遊戲開發【私人定制】

聯網 分析 html5 下載安裝 現實 微軟雅黑 app 打開 images 微信H5遊戲指??的是html5標記語言編寫的超文本網頁遊戲,具有無視平臺和系統的通用性。傳統的移動端遊戲要下載安裝以後才可以使用,而H5遊戲則免去了這些步驟,滿足用戶直接在微信中打開、操作,不僅

遊戲開發經驗談():對戰類全球服遊戲的設計與實現

bbr tro 機房 產品 sql 服務器 通過 簡單 自己實現 上篇文章《遊戲開發經驗談(一):遊戲架構裏隱藏的五個坑及其應對方案》,我們主要講解了遊戲架構設計當中隱藏的一些坑及其應對方案,錯過的小夥伴可以點擊鏈接回溯之前的內容。本期內容,將會重點介紹對戰類全球服遊戲的設

DataSet匯出到Excel比較完整的解決方案 --伺服器生成檔案 downmoon

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

【 Visual C 】遊戲開發筆記之 最簡單的DirectX vc視窗的編寫

                筆記一中我們介紹瞭如何用程式碼建立空的win32視窗,然而建立空的win32視窗只完成了一半的工作,接下來要做的工作是設定Direct3D,從而可以在螢幕上渲染圖形。Direct3D要呼叫很多函式才能成功設定API。一旦完成設定,並且設定成功,就可以向螢幕上渲染圖形。下面是函式

【Visual C 】遊戲開發筆記十 遊戲輸入訊息處理 一 鍵盤訊息處理

                ------------------------------------------------------------------------------------------------------------------------------淺墨歷時一年為遊戲程式設計

Qt 開發架構總結

最近在重構一個Qt專案,做的功能大致就是QGIS 二次開發,需要整合進來一下QGIS沒有的功能,由於前期沒有系統規劃,導致目前專案比較亂,所以就想著從功能和架構上拆拆,重新組織下,一下是技術大致思路 (1) 通過反射動態建立視窗 (2) 通過單利來獲取已經建立的視窗 (3) 通過xml檔案來

H5遊戲開發遊戲引擎入門推薦

前言很多剛剛接觸到遊戲開發,準備大展拳腳的小鮮肉們,往往在技術選型這第一關就栽了跟頭。畢竟網路上的遊戲引擎良莠不齊,官網上相關資料也比較少,而選擇一個適合的遊戲引擎是一個專案最基礎,也是很核心的一部分。試想一下,在遊戲開發進行到中後期的時候,才發現專案引入的遊戲引擎與需求相悖

遊戲開發架構 ECS Model 學習筆記

ECS是Entity-Component-System的縮寫,Wiki:Entity-Component-System,ECS模型遵循Composition over inheritance的原則