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