基於 Flink+Pravega 的遊戲伺服器監控與調節系統設計
01
背景介紹
1.1 團隊簡介
1.2 一些概念
Minecraft 中的遊戲實體包括三部分,掉落物實體、方塊實體、生物實體,極少量玩家線上時,無模組伺服器平均每分鐘都會有上千條實體更新事件產生。 當玩家增多時,玩家擺放的方塊,玩家身邊的實體會進行 tick 計算(1 秒=20 tick)。由於一些歷史和執行順序的原因,區塊生成、實體運算等加起來佔比超過 60%的部分,都在一個主執行緒上執行,市面上大多數嘗試拆分運算到多執行緒的服務端,都因為一些莫名其妙的 bug (破壞“遊戲機制” 或者 導致一些執行緒安全、執行順序、多執行緒反而造成效能下降的問題) 而不慍不火。 對於大型伺服器,任何 bug 都可能導致嚴重後果,本方案几乎不篡改遊戲機制,避免遇到上述 bug。 大型刷怪場 / 大型紅石機器 / 刷石機刷鐵機 /.../ 過大的生存建築包含過量的方塊實體。頭顱、箱子、信標、牌子、發射器、投擲器、旗幟、盔甲架等等都屬於方塊實體,每 1/20 秒都需要參與一次運算。讓這些東西扎堆出現,顯然對服務端不利,會嚴重影響伺服器TPS(Tick Per Second)。直接在服務端進行統計運算是不合適的,這會嚴重影響到玩家體驗。
1.3 方案目的
統計服務端叢集當前時刻實體的異常點,採用定點清除或限制等策略處理異常點,提升服務端運算效率,提高玩家體驗。 將 Minecraft 的日誌傳送到大資料後端,透過 Flink 進行演算法統計,將演算法引數,輸出結果寫入資料庫報表檢視,或者反饋到服務端對生物生成等引數動態調優。
02
設計方案
2.1 整體架構
2.2 日誌採集及資訊反饋
對掉落物、生物、狀態方塊進行埋點,獲取其唯一標籤 定時獲取伺服器 tps、gc 資訊,輸出到大資料後端 實時獲取玩家資料資訊,記錄玩家聊天資訊,互動資訊等 從 mysql 獲取大資料後端輸出的異常點,採用不同策略處理 實時獲取 mysql 資料庫中的服務端動態配置資訊,調整生物重新整理率,降低伺服器負載
2.3 資料傳輸
相對於傳統的 Kafka+Flume 組合,使用 Pravega 可以簡化系統處理架構。Pravega 能夠自動的將資料由熱儲存轉為冷儲存,不需要額外的 ETL 開發。 Pravega 對於高吞吐的歷史資料和低延遲的實時資料有一致的訪問方式,能夠有效滿足離線計算和實時計算兩種處理方式的統一。Pravega 便於後續擴充批資料處理業務,如基於長時間段內的資料進行深度學習模型訓練等。 Pravega 相比於 Kafka 可以節省資料儲存開銷。資料在 Pravega 只需要儲存一份,而 Kafka 需要儲存副本。 系統內部將 Pravega 作為儲存引擎與訊息佇列,利用其能夠自動伸縮的特性,能夠很好地代替 Kafka,並且透過 Pravega Flink Connectors 能夠使其與 Flink 之間絲滑對接。 出於學習的目的選擇使用 Pravega。Pravega 批流一體的儲存設計具有有大的發展潛力。
這裡使用 Springboot 將採集到的資料寫入 Pravega(demo 如下):
Flink 透過 Connectors 對 Pravega 資料進行消費。這部分使用起來跟 Kafka 差不多,非常方便。
2.4 資料處理
對資料進行 ETL
將總的日誌流按照類別進行分流處理,統計各類實體的數量,便於後續分析 資料處理中需要統計出當前時間內各類掉落物的數量以及當前的座標
主輸出流收集當前時間內掉落物的數量,每來一條遊戲日誌,判斷是否為掉落物類,如果是,判斷日誌型別為掉落或為拾取,分別加上掉落的 amount 或者減去拾取 amount。 側輸出流收集當前時間內掉落物的物品種類以及他們的座標位置,同樣每來一條遊戲日誌,判斷是否為掉落物類,如果是,將掉落物型別和它們的座標放進 map 中輸出。 分別將主輸出流和測輸出流寫進 MySQL 中,作為資料展示。
使用 DBSCAN 聚類演算法對資料點進行實時分析 考慮到伺服器中資料點的分佈是無規則的,而 DBSCAN 是一種可以處理任意形狀的空間聚類問題的基於密度的聚類演算法,所以該系統選用了 DBSCAN 對資料進行分析。DBSCAN 演算法還具有不需要劃分類別個數、可以處理噪聲點等優點。 這裡採用的是 org.apache.commons.math3.stat.clustering.DBSCANClusterer<T>
要實現實時分析,需要將舊的計算結果儲存起來,當新資料到來時能基於舊結果進行計算更新。我們採取的方案是:將每個 cluster 的密度 ρ(cluster 內資料點數/cluster 面積)作為 cluster 中心點的計算權值,既一批資料點經過聚類計算後得到的是各個 cluster 的中心點集,包含了中心點的座標和權值,將其儲存在 Flink 的 State中。當新的資料點到來時就將其與 State 中的中心點集一同進行聚類,並更新最新的中心點集到 State。 當某中心點 ρ 值大於設定的閾值,則判定為需要進行清理的點,將該點輸出至 MySQL 表中。伺服器檢測到表資料就會對該中心點所在區塊的資料進行清理。
2.5 效果展示
服務端將實體座標資訊傳給大資料後端,經處理輸出到報表系統,實時檢視地圖生物資訊。實現衛星地圖效果
Entity(生物類別)資料的分佈
tileEntity(方塊類別)資料的分佈
實體資料統計圖
如果你有足夠的耐心,就可以在伺服器裡用方塊實體擺一幅這樣的圖出來
03
結語
大型網遊的實時任務系統 Boss 掉落物的實時調整,物品推薦 服務端沒法迅速響應的分類迴歸預測 NPC的自然語言處理任務
參考
解構流儲存 — Pravega() MCBBS-外掛開發教程()
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024420/viewspace-2933730/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 基於系統融合的統一監控平臺設計
- 基於各種感測器的空調系統監控
- 基於 Prometheus 的監控系統實踐Prometheus
- 視訊監控系統的設計
- 伺服器監控系統部署與配置伺服器
- 基於關卡設計維度的戰棋遊戲系統與關卡設計用例遊戲
- Java生產環境效能監控與調優—基於JDK命令列工具的監控JavaJDK命令列
- 基於 Zabbix 系統監控 Windows、Linux、VMwareWindowsLinux
- 調研位元組碼插樁技術,用於系統監控設計和實現
- 遊戲伺服器儲存系統設計遊戲伺服器
- 【系統設計】指標監控和告警系統指標
- 如何把控遊戲系統開放節奏?遊戲
- SSH Exporter:基於Prometheus的遠端系統效能監控神器ExportPrometheus
- 基於原型的遊戲角色設計方法原型遊戲
- 伺服器監控系統部署文件伺服器
- 遊戲中的技能系統設計遊戲
- 基於 HTML5 WebGL 的 智慧樓宇能源監控系統HTMLWeb
- 構建基於 HarmonyOS Next 的分散式工業監控系統分散式
- 端午節景區影片監控方案:智慧景區EasyCVR影片監控系統構建與運用VR
- 基於AI演算法的資料庫異常監測系統的設計與實現AI演算法資料庫
- 前端監控基礎篇 — Docker + Sentry 搭建前端監控系統前端Docker
- 運維文件:伺服器監控系統運維伺服器
- 基於OkHttp的Http監控HTTP
- 基於施耐德PLC的水位測控系統如何實現遠端監控上下載
- 基於java的網路招聘系統的設計與實現Java
- 基於java的文章釋出系統的設計與實現Java
- 設計節奏點——讓遊戲與眾不同遊戲
- 3D遊戲程式設計與設計6——物理系統與碰撞3D遊戲程式設計
- 案例實踐丨基於SkyWalking全鏈路監控的微服務系統效能調優實踐篇微服務
- 關於雲控系統的各種細節
- 基於 HTML5 WebGL 的 3D 棉花加工監控系統HTMLWeb3D
- 基於 WebGL 的 HTML5 3D 棉花加工監控系統WebHTML3D
- Flutter異常監控 - 伍 | 關於異常監控框架設計的思考Flutter框架
- 北方某高校校園電力能耗監控系統的設計與應用方案
- 遊戲心理學研究:基於發展心理學與社會時鐘的遊戲設計遊戲設計
- 遊戲基礎知識——“內訌”情節的設計手法遊戲
- 基於 LLM 的智慧運維 Agent 系統設計與實現運維
- 3D遊戲程式設計與設計4——遊戲物件與圖形基礎3D遊戲程式設計物件