作為萬代南夢宮娛樂公司(BNE)打造的一款全新手機游戲,《七龍珠:武斗傳奇》基于公司旗下廣受好評的“龍珠Z”系列作品,目前已經(jīng)向全球玩家正式開放。為了做好準備以饗玩家服務(wù),BNE早在2017年2月就開始與Google Cloud溝通,探討這款游戲可能面臨的種種挑戰(zhàn),希望Google方面能夠提供足以應(yīng)對各類實際負載難題的強大云基礎(chǔ)設(shè)施。
《七龍珠:武斗傳奇》與GCP后端
根據(jù)預(yù)期負載強度,BNE方面提出了以下三條雄心勃勃的具體要求:
1.極高的可擴展性。這款游戲?qū)⒃谌蚍秶鷥?nèi)發(fā)布,因此需要一套能夠支持數(shù)百萬玩家并確保良好游玩體驗的強大后端。
2.全球網(wǎng)絡(luò)。這款游戲允許玩家之間實時戰(zhàn)斗,因此需要配備跨地區(qū)高可靠性、低延遲網(wǎng)絡(luò)。
3.實時數(shù)據(jù)分析。這款游戲支持玩家間的實時互動,因此要求數(shù)據(jù)分析流水線將數(shù)據(jù)流即時傳輸至數(shù)據(jù)倉庫。以此為基礎(chǔ),運營團隊將能夠衡量并評估玩家們的具體游玩方式,進而對游戲內(nèi)容做出快速調(diào)整。
在這三個領(lǐng)域,我們都擁有著豐富的實踐經(jīng)驗。Google在全球范圍內(nèi)運營著多種十億用戶級別的大型服務(wù),我們也會利用由服務(wù)產(chǎn)生的數(shù)據(jù)對服務(wù)內(nèi)容做出逐步改進。由于Google Cloud Platform沿用這些服務(wù)所使用的相同基礎(chǔ)設(shè)施,因此Google Cloud Platform客戶也將享受到同樣強大的技術(shù)支持方案。
下面,讓我們共同了解BNE如何與Google Cloud合作,共同為《七龍珠:武斗傳奇》構(gòu)建基礎(chǔ)設(shè)施。
挑戰(zhàn)一:極高的可擴展性
日本游戲廠商普遍使用MySQL,工程師們也習慣了關(guān)系數(shù)據(jù)庫中的模式(schema)、SQL查詢以及強一致性等要素。這大大簡化了應(yīng)用程序?qū)用娴墓ぷ?,保證技術(shù)人員不受數(shù)據(jù)庫限制(例如最終一致性或者架構(gòu)實施)的影響。事實上,在游戲領(lǐng)域之外,MySQL在日本同樣具有廣泛的使用空間,這里的大部分后端工程師都擁有豐富的MySQL實踐經(jīng)驗。
MySQL雖然具有諸多優(yōu)勢,但同時也存在一大致命短板:可擴展性差。具體來講,作為一套縱向擴展數(shù)據(jù)庫,如果要提高MySQL的性能水平,就需要同時添加更多CPU、RAM以及磁盤資源。另外,當單一MySQL實例無法處理當前負載時,我們需要將負載拆分成多個部分——相當于將用戶分成幾組,再逐一分配給不同的獨立MySQL實例。但是,這種分片操作同樣問題多多。大多數(shù)游戲開發(fā)人員需要在游戲上線之前核算出必要的數(shù)據(jù)庫分片數(shù)量,這是因為重新分片會占用大量人力而且極易出錯。一旦出錯,游戲廠商要么面臨數(shù)據(jù)庫過度配置的問題,要么是因玩家數(shù)量超出預(yù)期而無法提供必要的數(shù)據(jù)庫資源。這就帶來了一個現(xiàn)實難題:如果游戲的人氣水平與預(yù)期相符,那一切都好;但如果游戲大獲成功且需求超出預(yù)期,又該如何應(yīng)對?如果活躍用戶在游戲發(fā)布之初數(shù)量可觀,但之后逐步下降,又該怎么辦?MySQL分片無法動態(tài)擴展,相關(guān)調(diào)整不僅會帶來高昂的維護成本,同時也存在巨大的風險。
在理想條件下,數(shù)據(jù)庫應(yīng)當能夠在無停機前提下靈活實現(xiàn)規(guī)模伸縮,同時保持關(guān)系數(shù)據(jù)庫的固有優(yōu)勢。因此,在BNE方面表示他們正考慮利用MySQL分片處理《七龍珠:武斗傳奇》的大規(guī)模預(yù)期流量時,我們提出了自己的建議——Cloud Spanner。
為何選擇Cloud Spanner?
Cloud Spanner是一項全托管關(guān)系數(shù)據(jù)庫服務(wù),可提供橫向可伸縮性與可高用性保障,同時實現(xiàn)與MySQL架構(gòu)類似的高一致性水平。更重要的是,作為一項托管服務(wù),Cloud Spanner由Google SRE負責運營,幫助客戶擺脫數(shù)據(jù)庫維護負擔并最大程度降低停機風險。我們相信,Cloud Spanner將幫助BNE順利將這款游戲推向全球市場。
預(yù)先評估
在采用新技術(shù)之前,工程師自然有必要首先進行測試,以確保方案能夠在實際情況下提供符合預(yù)期的性能表現(xiàn)。在替換MySQL之前,BNE在Google Cloud Platform當中創(chuàng)建了一個新的Cloud Spanner實例,其中的表模式與MySQL用例保持一致。由于BNE的后端開發(fā)人員使用Scala編程語言,因此選擇了Cloud Spanner的Java客戶端庫,同時編寫了部分示例代碼以進行負載測試。通過這種方式,開發(fā)人員希望了解Cloud Spanner能否滿足游戲的每秒寫入率(QPS)需求——峰值約為30000 QPS。通過與Google客戶工程師以及Cloud Spanner工程團隊的通力合作,BNE方面輕松完成了測試目標。BNE方面甚至開發(fā)出自己的DML(數(shù)據(jù)處理語言)打包程序,用于編寫INSERT、UPDATE以及DELETE等SQL命令。
游戲發(fā)布
有了概念驗證作為前提,BNE方面開始放手實施。根據(jù)預(yù)期的單日活躍用戶(DAU)數(shù)量,BNE公司計算出支持全部預(yù)注冊玩家所需要的Cloud Spanner節(jié)點。在發(fā)布籌備階段,他們還先后進行了兩輪Beta封測進行后端驗證——數(shù)據(jù)庫全程運作良好!最終,《七龍珠:武斗傳奇》的全球預(yù)約玩家數(shù)量超過300萬,但憑借著充分的準備,官方為用戶帶來了堪稱完美的游戲首發(fā)體驗。
總結(jié)而言,在Google Cloud的協(xié)助下,BNE公司得以擺脫耗費精力的數(shù)據(jù)庫運營工作,專注于改進游戲本身的設(shè)計與體驗。
挑戰(zhàn)二:全球網(wǎng)絡(luò)
現(xiàn)在聊聊BNE面對的第二大挑戰(zhàn):構(gòu)建一款支持全球玩家實時對戰(zhàn)(PvP)的游戲。BNE在《七龍珠:武斗傳奇》的設(shè)計當中,引入了允許世界各地玩家隨時對戰(zhàn)的機制。即使不熟悉網(wǎng)絡(luò)知識,大家也會想到這種設(shè)計在延遲控制方面提出的挑戰(zhàn)。例如,東京與舊金山之間的往返時間(RTT)均值約為100毫秒。為了解決這個問題,BNE方面決定將每游戲中的每1秒時長拆分為4個250毫秒的基本單位。換言之,盡管玩家在進行游戲時獲得的是實時感受,但游戲本身實際上采取高速回合制設(shè)計。有些朋友可能覺得250毫秒的延遲已經(jīng)提供了充足的余量,但互聯(lián)網(wǎng)通信并不穩(wěn)定,實際延遲情況也往往很難預(yù)測。
為什么選擇云網(wǎng)絡(luò)?
下圖所示,為游戲客戶端如何通過互聯(lián)網(wǎng)訪問Google Cloud Platform上的游戲服務(wù)器由于每一次訪問的跳數(shù)都可能發(fā)生變化,因此玩家的實際PvP體驗也可能時而順暢、時而卡頓。
BNE之所以決定選擇Google Cloud Platform作為《七龍珠:武斗傳奇》的后端,一大重要原因在于Google提供的專用網(wǎng)絡(luò)體系。如下圖所示,當游戲客戶端訪問Google Cloud Platform分布全球的數(shù)百個入網(wǎng)點(POP)時,即可接入Google專用網(wǎng)絡(luò)。如此一來,所有躍點皆在可預(yù)測范圍內(nèi),從而保證延遲處于最低水平。
充分發(fā)揮Google Cloud網(wǎng)絡(luò)優(yōu)勢
通常,游戲廠商在實現(xiàn)玩家PvP操作時會選擇兩種方式:其一,建立玩家間直連;其二,通過專用游戲服務(wù)器連接。對于戰(zhàn)斗延遲要求較為嚴格的游戲,廠商往往會選擇P2P通信方式。但遺憾的是,P2P只能在兩位玩家地理位置相距不遠的情況下表現(xiàn)良好,跨區(qū)域通信時則效果不佳(某些運營商甚至會直接阻斷P2P協(xié)議)。如果兩位玩家身處不同大洲,那么在通過Google專用網(wǎng)絡(luò)進行通信時,系統(tǒng)會首先嘗試通過P2P進行直連;如果直連失敗,則將其轉(zhuǎn)移至coturn這一開源STUN/TURN Server處,由此作為兩個節(jié)點的通信中繼。如此一來,即使來自不同大洲,玩家也仍可享受到低延遲、高可靠性的Google網(wǎng)絡(luò)。
挑戰(zhàn)三:實時數(shù)據(jù)分析
BNE面對的最后一項挑戰(zhàn),正是實時數(shù)據(jù)分析。BNE希望為游戲玩家提供最出色的用戶體驗,目前的可行方法之一為實時游戲運營,簡稱LiveOps。這套方案允許運營人員持續(xù)對游戲內(nèi)容進行變更,從而長期保持新鮮的游戲體驗。但要想了解玩家的真實需求,運營團隊需要數(shù)據(jù)——通常是用戶的操作日志數(shù)據(jù)。如果能夠以近實時方式獲取這些數(shù)據(jù),運營團隊即可判斷應(yīng)對游戲做出哪些調(diào)整,借以快速提高用戶的滿意度與參與度。
為了收集這類數(shù)據(jù),BNE將Cloud Pub/Sub與Cloud Dataflow結(jié)合起來,旨在對用戶數(shù)據(jù)進行實時轉(zhuǎn)換,并將結(jié)果插入BigQuery。
Cloud Pub/Sub提供面向全球網(wǎng)絡(luò)的高可靠性消息傳遞系統(tǒng),該系統(tǒng)可對日志內(nèi)容進行緩沖,直到Cloud Dataflow接手處理。
Cloud Dataflow是一項全托管并發(fā)處理服務(wù),允許用戶以實時、并發(fā)方式執(zhí)行ETL操作。
BigQuery是一套全托管數(shù)據(jù)倉庫,用于存儲全部游戲日志。BigQuery提供PB級存儲能力,因此用戶無需擔心其擴展空間。憑借著強大的并發(fā)處理能力,BNE得以輕松應(yīng)對高強度日志查詢操作并快速獲取響應(yīng),甚至能夠在幾秒鐘之內(nèi)完成對TB級別數(shù)據(jù)的掃描。
這套系統(tǒng)幫助游戲開發(fā)商以近實時方式對玩家行為建立起可視化洞察,據(jù)此判斷應(yīng)在后續(xù)更新或者即時調(diào)整中做出哪些修改,從而滿足游戲玩家的實際需求。
總結(jié)
在Cloud Spanner的有力支持下,BNE得以專注于提升游戲品質(zhì),而不必將時間與精力耗費在數(shù)據(jù)庫容量規(guī)劃與擴展身上。
在運營方面,憑借著這套全托管可伸縮數(shù)據(jù)庫,BNE也能夠顯著降低由人類錯誤帶來的相關(guān)風險以及運營的成本。
利用云網(wǎng)絡(luò),BNE通過Google專用網(wǎng)絡(luò)為游戲玩家?guī)碜罴延脩趔w驗,確保來自不同地區(qū)的玩家享受對戰(zhàn)的樂趣。
最后,利用Google的分析服務(wù)組合(Cloud Pub/Sub、Cloud Dataflow以及BigQuery),BNE得以近實時分析玩家行為、快速調(diào)整游戲,最終快速改善玩家的游玩體驗。