天生一對,當遊戲遇上MongoDB
引
前端時間魔獸這個電影我相信大家都看過了哈,作為一個資深魔獸世界玩家(從公測時候就開始玩,當然現在是已經AFK多年),我對這個電影還是可以給好評的,畢竟裡面的一些場景還原度還是蠻高的,特效也做得不錯。不過肯定也會有人覺得不滿意,畢竟魔獸的遊戲做得太成功了(我這裡主要指魔獸世界),恢弘的史詩劇情,創新的團隊副本設計,豐富的遊戲體驗,各種令人讚歎的細節。作為一個碼農,有時候我也會去思考魔獸世界這個遊戲背後他的一些設計和實現,比如他用什麼資料庫。當然真正用什麼資料庫這個我是不確定的,我們今天的主題是當遊戲遇上MongoDB,所以我們只聊遊戲如果採用MongoDB作為資料庫有哪些好處。
靈活多變需求
我們知道,遊戲的一個特點是需求變化快,為了保持玩家一直有新鮮感,需要不停的往遊戲中加入新的元素。就拿一些MMO遊戲的裝備(道具)系統為例,假如使用傳統的關係型資料庫來存放這些資料,可能會面臨需要經常做表結構修改這樣的DDL操作。那如果採用MongoDB的話就不會有這個問題,schema-free的特性可以支援一個表(集合)內包含不同結構的文件。此外,MongoDB直接使用JSON格式進行資料互動,這也是最接近物件模型的,對開發人員來說非常友好。關於如何使用MongoDB進行資料建模可以參考TJ寫的MongoDB進階模式設計。
一些專有場景-道具自動過期和附近玩家
現在很多遊戲都走遊戲免費道具收費的模式,有很多類似道具自動過期的功能,這可以通過MongoDB的TTL索引來輕而易舉的實現。同樣,現在很多遊戲使用地理位置來作為社交系統的一部分,比如附近玩家這樣的功能。這也可以直接利用MongoDB的地理位置索引來做。MongoDB原生支援了這些功能,可以說非常方便。
高可用
以前玩魔獸世界的時候,每個禮拜二都要來一次停服維護。當時大家也習慣了,畢竟魔獸世界還是玩點卡的,遊戲時間都是自己花錢買的。但對於現在的免費遊戲來說,經常停服,可能玩家都會接受不了。對那些日流水好幾位數字的遊戲公司來說,時間就是金錢,停服維護可能就有種自己在不停燒錢的感覺。所以現在都要追求服務高可用,儘可能減少停服時間。資料庫服務通常也是整個遊戲服務中的一個重要環節。MongoDB的副本集是一個相當成熟的高可用架構,它通過一主多備結構保證服務的可用性,當主當機後還存活的備會自動選舉出新的主。
![replica_set_trigger_election]
(http://img1.tbcdn.cn/L1/461/1/b110e78a290958ba08dae37521de9d693f63f732)
阿里雲資料庫MongoDB在MongoDB自身高可用架構下做了進一步增強。採用一主一備一隱藏節點的經典3節點配置,對外暴露兩個VIP提供使用者訪問,在某個節點當機時自動進行VIP切換,保證使用者始終有2個節點可用。需要注意的是,這必須是使用者正確配置成副本集訪問模式時才生效。
高可擴充套件
說完高可用,我們來說說高可擴充套件方面。同樣還是魔獸世界,想必很多早期玩家都體驗過排隊,之所以要排隊,主要是因為服務能力不夠導致。當然,這通常和資料庫無關,不過,一個好的架構師是不會允許有某個環節出現明顯的瓶頸的。MongoDB由於其資料相對獨立的特性,相比於關係型資料庫,較容易進行水平擴充套件。其Sharding架構已在很多生產環境中久經驗證,業內有些公司對其進一步優化後已在管理上百PB的資料。對於運維人員來說也是相當友好,動態擴容和負載均衡都是自動進行的,使用者只需要選一個好的shard key即可。
回檔
運營遊戲有時候會面臨不得不對遊戲進行回檔這樣的痛苦選擇。因為程式不可避免會有bug的存在,如果有某個bug被惡意利用,亦或者是人皆會犯錯誤,某個GM不小心手抖發了大量RMB道具,都可能導致較大的經濟損失出現。如果遊戲不是很完善,沒有一個更好的解決方案的情況下,這時候可能就要考慮對遊戲進行回檔了。對於資料庫資料的回檔來說,MongoDB提供了一個延遲副本集節點的設定來解決這個問題。即,將某個節點配置成落後於最新資料一定的時間量。
當然,這還是很粗粒度的,如果要精確回檔到延遲時間內或者更早的時間點,甚至是任意時間點,就還要在備份恢復這塊上做更多的工作。阿里雲MongoDB近期會推出任意時間點恢復的功能,以滿足包括這個場景在內的備份恢復需求,敬請關注。
滾服
現在有很多遊戲都採用滾服作為快速增加營收的一個運營手段。如果使用MongoDB作為資料庫,可以利用其資料獨立帶來的好滾優勢。此外,阿里雲資料庫MongoDB的一個功能——從備份點建立例項,簡直就是專門為滾服打造的。只需事先為一個新服初始化好例項,然後建立一個備份集,就可以根據這個初始備份集快速建立多個例項,從而達到快速開新服的目的。
運營資料分析
現在是大資料時代,通過資料分析輔助運營決策是必不可少的。在資料分析方面,MongoDB提供了Aggregation pipeline和Map-Reduce這兩個強大的功能。其中Aggregation pipeline使用管道處理模型,提供了過濾、分組、排序等豐富的操作支援,具有較簡單的操作性兼顧較好的效能,而Map-Reduce則可以使用JavaScript進行自定義處理,在靈活性上更勝一籌。此外,結合阿里雲資料庫MongoDB還可以使用阿里雲的E-MapReduce利用雲上生態系統中的其他資料儲存系統如OSS、RDS等。資料可以在雲上自由流轉,發揮更大的價值。
總結
綜上所述,MongoDB有如此多的適合於遊戲開發場景的特性,還等什麼呢?趕快來阿里雲購買使用吧。目前阿里雲資料庫MongoDB採用的是3.2版本WiredTiger儲存引擎,售賣的是3節點高可用副本集架構,Sharding也會在今年下半年推出。我們擁有由官方認證DBA組成的專業原始碼維護團隊,致力於為使用者提供更好的雲資料庫MongoDB服務,讓大家用得更加省心!
相關文章
- 老遊戲遇上新問題:當動森遇上詐騙遊戲
- 當使用者管理系統遇上python和mongodb後……PythonMongoDB
- 當JSON.parse“遇上”非鍵值對JSON
- 當 Rust 遇上 FedoraRust
- 當UIColor遇上SwiftUISwift
- 當 React 遇上 KendoUIReactUI
- 當UIColor遇上 SwiftUISwift
- 當transition遇上display
- 當 Go 遇上了 LuaGo
- 當 Go struct 遇上 MutexGoStructMutex
- 當 bind 遇上 applyAPP
- 「跨界」碰撞!當AI大佬遇上量化對衝基金之王AI
- 當Shell遇上了NodeJSNodeJS
- 當區塊鏈遇上保險區塊鏈
- 當go get遇上gitlabGoGitlab
- 當Python字串遇上MySQLPython字串MySql
- 當微信小程式遇上filter~微信小程式Filter
- 當好萊塢遇上國產電影
- 當新零售遇上 ServerlessServer
- 當12C PDB遇上JDBCJDBC
- 當 JS 遇上物聯網(IoT)JS
- SOA Agents──當網格遇上SOA
- React 的效能優化(一)當 PureComponent 遇上 ImmutableJSReact優化JS
- 當動態桌面遇上 HTML5HTML
- Go死鎖——當Channel遇上Mutex時GoMutex
- [譯] 當設計模式遇上 Kotlin設計模式Kotlin
- 區塊鏈VS供應鏈:天生一對(附下載)區塊鏈
- 當博弈論遇上機器學習:一文讀懂相關理論機器學習
- 當催收遇上疫情,AI能做些什麼?AI
- 當頁面渲染遇上邊緣計算
- 當餐飲遇上大資料,嗯真香!大資料
- 當金融行業遇上開源技術行業
- 當資料探勘遇上戰略決策
- 當 jenkins遇上Android Studio 3.0JenkinsAndroid
- 當「軟體研發」遇上 AI 大模型AI大模型
- 瘋狂了!當遊戲愛上MongoDB會怎麼樣???遊戲MongoDB
- 當AI遇上展會——全息世界的又一“現在進行時”AI
- 天生一對,硬核微分方程與深度學習的「聯姻」之路深度學習