

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