阿里云原生內(nèi)存數(shù)據(jù)庫Tair在游戲場景的應(yīng)用,阿里云emr數(shù)據(jù)阿里云原生內(nèi)存數(shù)據(jù)庫Tair在游戲場景的應(yīng)用內(nèi)容簡要:一、游戲系統(tǒng)中的Redis二、云原生內(nèi)存數(shù)據(jù)庫Tair介紹三、Tair的游戲場景一、游戲系統(tǒng)中的Redis(一)Redis In Gaming Servers :分區(qū)分服游戲的架構(gòu)非常多,總結(jié)來看基本有三......
內(nèi)容簡要:
一、游戲系統(tǒng)中的Redis
二、云原生內(nèi)存數(shù)據(jù)庫Tair介紹
三、Tair的游戲場景
一、游戲系統(tǒng)中的Redis
(一)Redis In Gaming Servers :分區(qū)分服
游戲的架構(gòu)非常多,總結(jié)來看基本有三種,第一種是分區(qū)分服的游戲,第二種是全區(qū)全服,第三種是全球同服。最近全同服的游戲比較火,線上做了很多收割,而分區(qū)分服也適用于一些游戲場景。
Redis的使用場景可以分為兩種,一種場景是當(dāng)緩存使用,另一種場景是當(dāng)內(nèi)存數(shù)據(jù)庫使用。Redis的使用場景在國內(nèi)外的定位是不一樣的,在國外大多數(shù)Redis都是作為緩存使用,但在國內(nèi),可以說70%的用戶是當(dāng)做內(nèi)存數(shù)據(jù)庫。
下面就用一個分區(qū)分服的場景來介紹下Redis的典型用法。
在游戲登錄的時候,這些關(guān)系型數(shù)據(jù),包括用戶數(shù)據(jù)、用戶賬單、計(jì)費(fèi)記錄等肯定是在關(guān)系型數(shù)據(jù)庫里。這里Redis的特點(diǎn)是,比如有一個注冊活動或者新服開放,當(dāng)大量的用戶進(jìn)來后,我們就需要使用一些緩存來抗住壓力,
所以這里的Redis的使用主要是緩存場景。
第二塊是分區(qū)分服里最核心的GameServer。
GameServer是一個強(qiáng)內(nèi)存的計(jì)算型服務(wù),它不會有核心的服務(wù)在數(shù)據(jù)庫里面,但它的一些周邊服務(wù),比如排行榜,還有一些通用的服務(wù),比如分布式鎖,對戰(zhàn)匹配,選角記錄等都通常放到Redis里邊。
還有一塊是圖中間的部分。當(dāng)GameServer變更到一些數(shù)據(jù),如游戲用戶的經(jīng)驗(yàn)變化,游戲獲得的裝備,這些核心關(guān)鍵數(shù)據(jù)也是存入關(guān)系型數(shù)據(jù)庫,因?yàn)檫@些東西都是游戲資產(chǎn),上方紅色部分的場景在RDS里是做緩存。
除此之外還有一些周邊系統(tǒng),在這種分區(qū)分服游戲里,一般也有一些跨服對戰(zhàn)。消息隊(duì)列,mailbox等。這些數(shù)據(jù)也經(jīng)常放在Redis中,使用方便,性能也很好。
還有最后一塊是上圖右下角的部分,游戲公司經(jīng)常會做一些活動,比如做一些宣傳,還有類似于防作弊、防木馬的情況,需要把用戶日志落盤,這個每天生成的數(shù)據(jù)量很大,一般都會放到一個Data Warehouse或者一個分析型數(shù)據(jù)庫如ADB里面供后續(xù)挖掘。此時游戲公司還需要分析活動是否成功,是否需要做投放,Redis在這里提供工單緩存/分析加速。
以上是Redis在分區(qū)分服游戲中的一些使用場景。
(二)Redis In Gaming Servers:全球同服
另一個是最近熱門的全球同服場景,上圖是它最基本的技術(shù)架構(gòu)。
全球同服的特點(diǎn)是,所有的國內(nèi)外節(jié)點(diǎn)都是訪問了同一份數(shù)據(jù)庫。游戲行業(yè)的一個特點(diǎn)是對數(shù)據(jù)庫的性能要求并不高,但是對網(wǎng)絡(luò)和計(jì)算的要求非常高。在游戲行業(yè)里,我們常說最遠(yuǎn)的距離可能不是數(shù)據(jù)到數(shù)據(jù)庫的距離,而是“電信到聯(lián)通”的距離。在這種全球同服游戲架構(gòu)里,有一個很復(fù)雜的問題就是數(shù)據(jù)既然集中了存儲在一個地方,那么在長距離訪問時就會遇到嚴(yán)重的體驗(yàn)問題。實(shí)際上,在這種全球同服的游戲架構(gòu)里,它都會有一個Cache Svr,把遠(yuǎn)端的數(shù)據(jù)都緩存在本地,然后讓本地的訪問去增刪查改它,降低訪問時延,這是全球同服游戲架構(gòu)里的一個核心技術(shù)。在cache server技術(shù)中,由于Redis本身可以作為很好的緩存,所以這里使用得比較多一點(diǎn)。
由于數(shù)據(jù)是集中式存儲,當(dāng)所有游戲用戶都去訪問一個大數(shù)據(jù)庫的時候,要求還是很高的。對于Redis而言,一般都有一個Redis Cluster可以提供訪問。
以上是Redis在全球同服游戲里的使用場景。
(三)游戲?qū)edis的要求
如果游戲要用做高速存儲、內(nèi)存數(shù)據(jù)庫等,那么它對Redis有哪些要求
首先,對數(shù)據(jù)庫的要求是可靠性。對于Redis來說,在電商場景和游戲場景中可靠性要求都很高,但是在例如鏈路管理上還是差別較大。例如,對于電商體系而言,鏈路管理的特點(diǎn)是出問題就斷,寧可返回一個錯誤的結(jié)果,也不會Block,因?yàn)樗械碾娚替溌范际荖o Blocking,出現(xiàn)問題斷了就好,下次再處理。但是游戲行業(yè)不一樣,它需要很好的鏈路保持能力,可以慢慢解決,但是鏈接不能斷,因?yàn)閿嗔酥蠛蠖说臉I(yè)務(wù)就斷掉了,業(yè)務(wù)層還掛著各種游戲的資源信息等,這是游戲行業(yè)跟電商行業(yè)不一樣的一個地方。
一般情況下,很多游戲數(shù)據(jù)庫平均的訪問量都不大,但是不能出問題,第一是鏈路不能斷,第二是如果扛不住的時候,要求能夠平滑擴(kuò)縮容。它對平滑性的要求特別高,因?yàn)楫?dāng)一個游戲突然火了,或者剛開服時有很多用戶去注冊登錄的時候形成注冊風(fēng)暴,會發(fā)生大量擴(kuò)容的行為,如果在擴(kuò)容速度或者平滑性上有所欠缺,那么用戶體驗(yàn)就特別差。
另外,在做一個全球同服游戲的時候需要考慮容災(zāi)和多活的能力。高可靠性對數(shù)據(jù)庫類似于保險(xiǎn),抗熱點(diǎn)、抗壓力是保險(xiǎn),平滑擴(kuò)容也是保險(xiǎn)。
游戲?qū)?shù)據(jù)庫有高可運(yùn)維的要求。電商數(shù)據(jù)庫基本不會涉及太多的運(yùn)維,因?yàn)槊刻斓墓?,包括交易,購物,交易快照等都是存下來的,最多索引一下,不會來回搬?shù)據(jù)。但是對游戲而言,由于每天產(chǎn)生的數(shù)據(jù)和日志特別多,并且游戲運(yùn)營迭代特別快,比如有些分區(qū)分服的游戲,尤其做滾服、合服,迅速開一個新的服務(wù)器,把數(shù)據(jù)庫導(dǎo)過去,然后去滾動,這些游戲運(yùn)營模式對數(shù)據(jù)運(yùn)維要求特別高。當(dāng)游戲用戶反饋說在游戲中丟了東西,我們需要幫他進(jìn)行查找,因此需要支持?jǐn)?shù)據(jù)恢復(fù),還有內(nèi)省、清洗等。
此外還有低成本。游戲行業(yè)有很明確的冷熱效應(yīng),游戲剛開始特別火,等游戲熱度慢慢降下來之后,需要迅速把數(shù)據(jù)存下來換出去,降低運(yùn)營成本,這也是非常關(guān)鍵的一點(diǎn)。低成本考察的是介質(zhì),像Redis這種數(shù)據(jù)庫,如果數(shù)據(jù)量都放到內(nèi)存里,那么成本一定比較高。有一塊節(jié)省成本的措施是極致彈性,比如今天游戲做活動,我們把數(shù)據(jù)給彈上去,明天再拆下來,只要有足夠彈性,那么成本是可控的。
最后是快速開發(fā)。游戲行業(yè)的在開發(fā)上的特點(diǎn)是快速迭代,競爭比較激烈,推出游戲的速度特別快,如果成功,則馬上準(zhǔn)備下一版,不成功就很快收掉做下一個游戲。所以如果有框架支持,更多的API,提供更多的封裝和語法糖,那么它可以很迅速地搭建適合自己的游戲體系。
二、云原生內(nèi)存數(shù)據(jù)庫Tair介紹
云原生內(nèi)存數(shù)據(jù)庫Tair(Redis企業(yè)版)是阿里云推出的支持高并發(fā)低延遲訪問的云原生內(nèi)存數(shù)據(jù)庫,完全兼容Redis數(shù)據(jù)結(jié)構(gòu)和API。支持主從與集群架構(gòu),采用多樣存儲介質(zhì)應(yīng)對不同數(shù)據(jù)溫度場景,并提供全球多活、數(shù)據(jù)閃回和豐富的數(shù)據(jù)模型等特性,致力于幫助客戶構(gòu)建在線實(shí)時場景。
Tair兼容了Redis的數(shù)據(jù)結(jié)構(gòu),那么面向游戲行業(yè),和Redis的差別主要是什么呢
首先是容災(zāi)方面,開源的自建Redis沒有很可靠容災(zāi),但阿里云Tair通過可靠的高精度容災(zāi)模塊,能夠做到快速容災(zāi),比如10秒級就可以切換掉一個有問題的數(shù)據(jù)庫。
第二個是鏈接保持能力,游戲領(lǐng)域?qū)︽溄颖3值男枨蠛芨?,這和電商、直播等領(lǐng)域不太一樣。Tair通過代理層的熱升級能力,將鏈接盡可能保持,確保了升級、宕機(jī)等多種情況下的可用性。
第三,一般數(shù)據(jù)庫做容災(zāi)就是主備容災(zāi),用Redis的時候也可以搭個主備出來,阿里云Tair除了采用多可用區(qū)容災(zāi)或跨可用區(qū)容災(zāi)之外,還提供了跨域多活容災(zāi)的能力。注意的是跨域容災(zāi)不一定是多活,但多活一定是跨域容災(zāi)。
還有就是備份,備份很關(guān)鍵,可以防止刪庫跑路等情況。游戲行業(yè)的特點(diǎn)是發(fā)版本的速度特別快,如果版本發(fā)錯則需要快速回滾。Tair提供任意時間點(diǎn)的數(shù)據(jù)恢復(fù),當(dāng)游戲廠商發(fā)現(xiàn)發(fā)布的版本有問題,可以馬上回滾,降低影響。除此之外,Tair還支持秒級數(shù)據(jù)閃回這樣更精密的數(shù)據(jù)回滾能力,可以指定過去任意秒級時間點(diǎn)按key/key pattern或者全量恢復(fù)數(shù)據(jù)。
在這種日常運(yùn)維中,可觀測性是需要建設(shè)的重點(diǎn),業(yè)務(wù)在運(yùn)行中不可避免會遇到實(shí)時熱Key、大Key。由于游戲迭代速度很快,質(zhì)量方面難免偶爾出現(xiàn)問題,我們能夠通過實(shí)時和歷史Key分析快速找到這些瓶頸并解決問題。在Tair中除去能夠迅速觀測到熱點(diǎn),還能夠迅速把熱點(diǎn)加速掉,我們稱之為散列技術(shù),可以把熱點(diǎn)的抗壓能力輕松提升到10~30倍。
成本上,從我們的角度來看Redis,往內(nèi)存里邊放的東西越多,成本就越高,內(nèi)存是所有的存儲里最貴的。但是阿里云Tair有更好方式,我們有Tair持久內(nèi)存型,很好地解決了存儲成本和訪問性能的矛盾。最早做持久內(nèi)存的時候,它沒有什么企業(yè)級特性,后續(xù)我們把企業(yè)級能力都搬到持久內(nèi)存上,如今大家去買持久內(nèi)存的話,就具備這些企業(yè)級能力,包括PITR、多活、加速等。
開源Redis的好處在于它跟一般的KeyValue不一樣,它存很多結(jié)構(gòu)化數(shù)據(jù),跟數(shù)據(jù)結(jié)構(gòu)更貼合一點(diǎn),用得比較快一點(diǎn)。但是我們發(fā)現(xiàn)用戶真正用起來的時候,這些結(jié)果是不夠的。游戲用戶大量使用JSON,比如存用戶屬性、道具等,都是JSON結(jié)構(gòu)。所以Tair引擎里已內(nèi)置了JSON結(jié)構(gòu),那么用戶用起來就非常方便了。
三、Tair游戲場景介紹
(一)Tair全球多活
Tair有一個典型的場景是全球多活。
這個是線上的一個例子,例如游戲里中國用戶可以到美國的商店里去買一個光環(huán)裝備,然后這個用戶在國內(nèi)服務(wù)器上就具有了一個光環(huán)。
全球多活是基于引擎高可靠的數(shù)據(jù)多活服務(wù),Tair提供全球同服的高效Cache Server,數(shù)據(jù)庫本身具備多活,數(shù)據(jù)寫入一個地方,那么所有地方都可見。
多活在游戲里基本是用在Cache Server上,所有互聯(lián)網(wǎng)類的用戶都會有一個登錄Session系統(tǒng),如果要去把Session系統(tǒng)做大,做一個很可靠的全球多活Session,Tair也能支持。
(二)數(shù)據(jù)閃回 任意時間點(diǎn)數(shù)據(jù)恢復(fù)
Tair另外一個經(jīng)典場景是任意時間點(diǎn)的數(shù)據(jù)恢復(fù),它實(shí)際上是數(shù)據(jù)安全的一部分。數(shù)據(jù)安全包括鏈路加密,也包括存儲加密,還包括多副本等。
但任意時間點(diǎn)數(shù)據(jù)恢復(fù)這個場景游戲客戶用得最多,大約占90%。游戲廠商在發(fā)版本的時候,如果出現(xiàn)問題可以快速回滾,也支持只回滾某一些東西?;貪L既支持把數(shù)據(jù)恢復(fù)到源,也支持克隆一個新實(shí)例來恢復(fù)。
(三)CAS/CAD 高性能分布式鎖
剛才我們從分區(qū)分服的服務(wù)器里邊也看到了,Redis本身會作為Game Server的一些周邊服務(wù),最簡單一個例子就是分布式鎖。多個機(jī)器同時去拿一個資源的時候,牽扯到資源競爭肯定要有鎖,業(yè)務(wù)需要通過分布式鎖來解決。但這個分布式鎖很少有人實(shí)現(xiàn)的對,所以我們就直接把分布式鎖做在這個引擎里面了。
分布式鎖比起一般的鎖,它除了有互斥性,還有租約性。一般會在鎖上加一個Timer,設(shè)置鎖多長時間,當(dāng)租約到期后,鎖自動釋放。
分布式鎖存在的問題不是加鎖的地方,而是釋放的地方。舉個例子,比如一個應(yīng)用程序去加了鎖,應(yīng)用程序沒有掛,但是時間拖得長一點(diǎn),然后等到引擎里面的Timer超時,鎖就釋放了。結(jié)果第二個應(yīng)用程序就拿到鎖了。當(dāng)這個APP又跑起來的時候,我們一刪鎖就把別人的鎖給刪掉了,會引發(fā)資源錯誤。
因此,難點(diǎn)在刪除這一步,刪除時的要求是只能刪自己的鎖,不能刪別人的鎖。所以很多的云上用戶,如果用去del命令去刪Key的話就刪錯了,正確的實(shí)現(xiàn)是一個事務(wù)操作,而Tair直接在引擎里實(shí)現(xiàn)了分布式鎖。
阿里內(nèi)部90%的分布式鎖都是使用Tair的高性能分布式鎖,包括許多游戲客戶也經(jīng)常使用。
(四)TairDoc:游戲業(yè)務(wù)快速迭代
另一個核心的module能力就是TairDoc,因?yàn)镴SON數(shù)據(jù)結(jié)構(gòu)是游戲用戶里最大的特征結(jié)構(gòu),我們更新JSON的時候不需要該表,直接在對應(yīng)的JSON數(shù)據(jù)中增加相應(yīng)信息即可。
(五)TairZset: 多維/多條件實(shí)時排序
排行榜是游戲場景的最常見應(yīng)用,也是Redis的一個主要應(yīng)用場景,甚至有些大型游戲公司有一個專門的排行榜組,給全平臺游戲人員提供排行榜服務(wù),而非直接暴露一個Redis zset接口。在具體開發(fā)實(shí)現(xiàn)中,會遇到如下兩個主要的問題。
第一個問題是在對戰(zhàn)的時候,玩家選擇排行榜上的其他玩家PK,肯定也是選一個分?jǐn)?shù)和時間差不多的,因此,做排行榜的時候是多維度的。例如在直播網(wǎng)站,可以看到在線人數(shù),粉絲點(diǎn)贊數(shù),禮物金額等。如果按照一個個維度去做的時候,那么很難做一個很精確的使用。開源的Redis只能提供一維的排行榜,而Tair則可以提供包含多個Score的多維排行榜,這樣的多維/多條件實(shí)時排序能力很好地解決了這個問題,開發(fā)者使用起來也會非常的敏捷順手。
第二個問題是當(dāng)游戲特別大的時候,例如游戲用戶有2000萬人,那么2000萬人的排行榜是非常大的了,在這樣規(guī)模排行榜程序設(shè)計(jì)上把所有的用戶都存在一個Key下面,Redis就會發(fā)生數(shù)據(jù)傾斜,性能也不是特別好,而如果要把 Key拆開,因?yàn)榕判邪窦炔环戏峙渎?,也不符合交換率,所以拆的話也比較難。針對這個痛點(diǎn),通過TairJedis更可以創(chuàng)建分布式排行榜,非常敏捷的構(gòu)建大規(guī)模、高靈活度的排行榜應(yīng)用,用戶可以根據(jù)業(yè)務(wù)容忍度和性能訴求選擇分布式精確/非精確排行榜而不用關(guān)注實(shí)現(xiàn)細(xì)節(jié),讓游戲開發(fā)者能夠更加敏捷地進(jìn)行游戲邏輯的開發(fā),這些細(xì)節(jié)都是通過SDK層結(jié)合低層TairZset能力幫助用戶構(gòu)建起來的。
后續(xù)Tair的產(chǎn)品發(fā)展過程將會針對游戲行業(yè)的更多場景提供更為靈活敏捷的能力,同時在客戶降本增效上做進(jìn)一步探索。
特別聲明:以上文章內(nèi)容僅代表作者本人觀點(diǎn),不代表ESG跨境電商觀點(diǎn)或立場。如有關(guān)于作品內(nèi)容、版權(quán)或其它問題請于作品發(fā)表后的30日內(nèi)與ESG跨境電商聯(lián)系。
二維碼加載中...
使用微信掃一掃登錄
使用賬號密碼登錄
平臺顧問
微信掃一掃
馬上聯(lián)系在線顧問
小程序
ESG跨境小程序
手機(jī)入駐更便捷
返回頂部