c s具體通訊流程
伺服器間的互動
與資料庫互動的伺服器
玩法伺服器
現有的gameserver/battleserver的負載有多少?
幾萬,battleserver負載均衡
建立乙個房間是怎麼分配到哪個伺服器,有幾個業務伺服器,建立房間區分到哪個伺服器上
gameserver
battleserver 僅僅支援打牌邏輯之類的操作
伺服器型別的劃分
客戶端僅僅和inte***ce之間建立連線 inte***ce和各個伺服器之間進行互動
連線伺服器、業務伺服器
訊息的同步
怎麼同步到各個客戶端,壓力比較大的情況怎麼處理
netty同步機制
server結構簡述
1網路通訊
2業務邏輯
3資料儲存
現有的伺服器及其職責
1 manageserver
2 authserver 單點伺服器,登入驗證
3 gameserver
4 clubserver
5 campaignserver
6 pushserver 推送伺服器
7 replayserver
8 battleserver 多點伺服器 戰鬥服
9 inte***ceserver 多點伺服器 閘道器
為啥要這麼多伺服器,是否可以乙個伺服器承擔多個角色?
網路通訊
通訊資料協議使用protobuf進行定義 message管理協議的定義生成,生成客戶端使用的協議檔案
協議配置檔案
req, res
threadpool
業務執行緒池,對於每乙個業務任務,按照任務的key,分配到不同的任務組中,多個任務組非同步執行,同乙個任務組同步執行
網路處理
server之間的通訊和客戶端和閘道器之間的通訊,都是基於netty框架建立的tcp通訊,處理連線的建立和斷開,傳入和傳出資料處理
connection
1 邏輯連線,內部儲存netty真是管道資訊和獲取連線點資訊(ip等)和傳送訊息
2 作為client-inte***ce連線,處理協議加密邏輯
channelhandler
netty中進行報文的編碼解碼、報文資料壓縮解壓、自定義協議的編碼和加密。
handler分為輸入流處理handler、輸出流處理handler以及混合handler
伺服器主要新增了一下handler 2 3 是netty自帶的
1 haproxydecoder 閘道器伺服器專用,由於閘道器之前有一層高防機器,客戶端的訊息被高防**,報文中的ip資訊為是高仿機ip,實現透明**,獲取客戶端真是ip
2 lengthfieldbasedframedecoder 處理黏包問題
啥叫黏包
3 lengthfieldprepender 附加資料長度,2位元組
5 messageprocessor 協議解析
client inte***ce
byte
byte
byte
4byte
4byte
訊息型別
加密型別
目標serverid
協議id
callback
protocl
inte***ce -> server
byte
4byte
4byte
4byte
4byte
4byte
訊息型別
玩家id
connectionid
玩家ip
協議id
callback
protocl
server -> inte***ce
byte
4byte
4byte
4byte
訊息型別
connectionid
協議id
callback
protocl
server server
byte
4byte
4byte
訊息型別
協議id
callback
protocl
業務邏輯
閘道器協議加密
協議加密
c s協議通訊內容進行加密,加密階段處於c和inte***ce之間。加密原則是由客戶端發起,當客戶端發起的協議加密,伺服器的響應也進行加密,反之亦然
1 客戶端建立與伺服器進行連線後,伺服器退給客戶端乙個加密演算法型別和加密key
2 當客戶端傳送的協議未加密或者加密型別與伺服器推送給它的型別一樣時,進行協議解密,處理業務邏輯
3 心跳包 客戶端傳送不加密
4 客戶端傳送上來的協議不加密,那麼伺服器傳送回去的協議也不加密
流程圖
協議涉及
syntype 加密型別
key 加密key
對外介面描述
客戶端建立連線後,傳送加密資訊給客戶端
資料儲存zdb
limax官網
死鎖概述
潮汕 2017.11
現象:因戰績快取條數較少,在高峰期大量的查詢戰績請求導致快取一直失效,並且產生了清快取的執行緒池拒絕執行的錯誤
限制:對於資料快取的條數需要合理設定,避免出現頻繁清快取的情況
貴陽 2017.11
現象:俱樂部公告推送上線後,mysql查詢量從前一天的1000條每秒飆公升到2000多條每秒
問題:通過gmt後台給俱樂部加一條預設資料,避免每次查詢時都要到mysql去查詢
原因:當select乙個mysql中不存在的key時,會始終執行sql操作。如果該查詢非常頻繁,會導致mysql查詢量飆公升
限制:查詢資料**估該查詢發生的頻率,如果會非常頻繁,則需要考慮key不存在的情況
17/12/01 潮汕線上戰績丟失情況
表現:同比貴陽,貴陽的戰績丟失數量是20~30,潮汕的戰績丟失量是200+
原因:同比貴陽,貴陽在查詢戰績的時候使用select獲取讀鎖,不對過期戰績進行刪除操作。
修復:同步貴陽**(查詢讀鎖,不刪除戰績;回放資料拆分為新錶)
17/12/19 零點game伺服器死鎖
鎖:persist_global 1
runtime_global 2
allareas 3
a2: logins (老使用者)
1 2 3
d: roomstaterecordtask(非zdb鎖)
3 21. 先發生a2 d
2. 然後發生a2
17/12/20 零點俱樂部程序消失
表現:為了解決昨天凌晨的死鎖問題,臨時決定在零點對白名單進行開啟關閉操作,避免死鎖發生,結果1分鐘左後club伺服器的程序消失
原因:使用讀鎖進行資料修改,zdb存檔是使用讀鎖訪問storage的資料,生成將要寫入資料庫的資料時,發生了list資料被修改的異常,造成zdb崩潰。
其他常見情況:
1. 鎖順序不一致性造成伺服器死鎖。
2. 業務中自定義reentrantlock鎖,在持有鎖期間呼叫zdb鎖造成的巢狀死鎖。
3. list資料遍歷訪問zdb鎖造成的順序不一致性。
4. 快取條數的合理設定,預設10240條記錄
5. 當以key為0查詢表中的資料時,及時表內不存在該記錄,依然能夠查詢出資料
6. 表的快取機制使用lru,不要使用concurrent模式(會導致記憶體持續增長,伺服器崩潰)
棋牌遊戲例子
器的計算能力合併成邏輯上的一台單一伺服器,所以本示例中我們只考慮單伺服器 單程序的設計方法。對於玩家,需要支援的操作有 1.登入 2.檢視房間列表 3.建立房價 4.進入房間 5.玩遊戲 6.房間內聊天 7.遊戲完成,退出房間 8.退出登入 系統設計 玩家 id,使用者名稱,等級,經驗 子系統 玩家...
滲透H5棋牌遊戲 棋牌遊戲開發
0x01 前言 本來不想發的,涉及太多利益了,這些棋牌遊戲的原始碼最高能賣到幾萬。開發起來不比乙個商場程序難。最近又太忙了,沒時間去做程式碼審計的文章了,但一不小心又搶了個運氣王。0x02 開始 一天做這行的朋友來找我,說幫審計下一套程序,正好這邊的缺一篇文章就順便去看看了。開始看了下目錄,找了幾個...
手機棋牌遊戲 棋牌遊戲發展的必然趨勢
就現在市場而言,pc和平板是目前市場上面的主流,但是由於智慧型手機的興起。而手機的普及性使得手機客戶端的使用者遠遠高於pc與平板電腦使用者。為此,針對手機使用者這塊市場,我們應該順應市場需求,結合手機平台的優點 長處做出跨平台的棋牌遊戲。緣由如下 首先,隨著智慧型機3g網路日漸普及,流動網路遊戲使用...