遊戲開發常遇到數據一致性BUG,怎麼解?

摘要:數據副本強一致、全節點可寫、存儲全面降本,GaussDB(for Redis)重新定義遊戲數據庫,徹底修復一致性BUG。

本文分享自華為雲社區《華為雲GaussDB(for Redis)揭秘第24期:遊戲一致性BUG怎麼解》,作者:高斯Redis官方博客 。

關於遊戲與一致性

最近在跟一些遊戲客戶交流,聊到了容易讓人「踩坑」的數據一致性問題,常見BUG有「背包道具丟失」、「一個玩家同時加入兩個公會」等等。這類問題往往藏得比較深,等到遊戲上線後期才發現,會比較難解決。

其實,只要前期做好數據庫選型和架構設計,一致性問題是可以避免的。本文將聚焦兩大主要場景,對數據一致性問題進行詳細剖析。

場景一:讀寫分離引起的數據不一致問題

在遊戲行業,MySQL很多時候都是首選的「主數據庫」。然而遊戲業務也有很多高並發場景,當上千RPS的MySQL不夠用時,為了提升吞吐,就可能會做讀寫分離、分庫分表。

但如果需要更高吞吐能力,MySQL可能會無法滿足,這時可以引入Redis,利用NoSQL的強擴展性,承載上萬,甚至是數十萬RPS。同樣的,Redis也可以做讀寫分離。

1.讀寫分離引發的BUG

  • 背包道具丟失(MySQL做主數據庫場景)

BUG描述:玩家在遊戲地圖A購買道具,隨後立刻切換地圖,進入遊戲地圖B,結果打開背包竟發現道具丟失。

根因分析:前一個地圖的購買行為寫入主節點,而新地圖中打開背包時查詢了從節點。由於主從同步有延時,導致沒查到最新數據。

  • 關注好友後漏發Hi~(Redis做主數據庫場景)

BUG描述:在某個遊戲地圖中遇到美女玩家,關注對方後,本應自動發送預定義招呼語,對方卻遲遲沒有收到。

根因分析:好友鏈這種業務很適合用Redis做主數據庫(提供靈活的hash/set/zset)。但是社區版Redis天然弱一致,原理同上,由於臟讀發生,讀寫分離必踩坑。

2. 如何解決?

做讀寫分離的初衷,其實還是對算力水平擴展有訴求,同時也是不想讓那些「Slave」們閑置浪費(畢竟算力成本也是錢吶)。

其實,數據庫不止MySQL一種,緩存也不止Redis一種。

華為雲GaussDB(for Redis)作為企業級定位的KV數據庫,已經在很多業務場景被用作 「主數據庫」了,單實例存儲TB級數據是家常便飯。

GaussDB(for Redis)可以根除讀寫分離的一致性問題,原因如下:

1)支持36個節點,全都可讀可寫(全員Master,算力別浪費)

2)數據強一致(無需主從分離,並發訪問任一節點都無臟讀)

3)單實例承載數百萬QPS(高吞吐需求從來不是事)

很顯然,高斯Redis完全可以滿足「既要、又要」的業務訴求,讓遊戲遠離讀寫分離之「坑」。

【有人可能會說,對不起,我是土豪,Slave就只用於高可用,我的業務不讀它,這樣總不會踩坑了吧?其實,隱患還是存在的!】

場景二:主從切換引起的數據不一致問題

請時刻注意,你使用的數據庫,不論是MySQL還是Redis,他們都是高可用的。而高可用意味着,當主節點故障時,它們會發生主從切換。

1. 主從切換引發的BUG

BUG描述:暑假做活動,全服玩家參與搶購100件稀有裝備(官方公告:每件都是全服僅有)。後來在公會PK時,持有「屠龍刀」的玩家A遇到了持有「屠龍刀」的玩家B……發生了「撞刀」。

根因分析:活動期間,業務使用了一套Redis主從做搶購,創建一個Redis隊列存稀有裝備。活動期間請求量高,Redis發生了主從切換。於是BUG就這樣發生了:本來隊列已經pop掉了「屠龍刀」,但是由於主從同步延遲,從節點頂上來後,其中隊列內的「屠龍刀」此時還沒有被pop掉!活動繼續,於是隨後兩個玩家同時擁有了「屠龍刀」。

2. 如何解決?

開源Redis主從切換導致的此類BUG其實很常見,業務以為訪問的數據是穩定的,但其實社區版Redis隨時可能「突變」(主從切換)導致業務讀到舊數據。

解決辦法還是一樣——做正確的數據庫選型,使用華為雲GaussDB(for Redis)。

為什麼說GaussDB(for Redis)沒有這類問題:

1)數據強一致存儲,故障場景業務不會發生臟讀

2)故障秒級恢復(社區版Redis啟動慢,需加載全量數據,故障恢復慢)

3)存算分離架構,容忍N-1分片故障(社區版Redis只要故障1對分片,業務無法恢復)

使用高斯Redis,完全不用擔心臟讀發生。

結語

其實在很多業務場景,如果不希望出現臟讀導致業務BUG,那麼華為雲的高斯Redis的確是最佳數據庫選型。另外,高斯Redis自帶了冷熱數據交換能力,本身也是一個兼顧了性能與成本的降本方案,像是遊戲公司常用的protobuf序列化數據,高斯Redis能實現500G到160G的數據壓縮(案例數據),輕鬆節省70%存儲空間。

高斯Redis既能為遊戲業務保駕護航,又省心省力省錢,何樂而不為!

附錄

  • 本文作者:華為雲數據庫GaussDB(for Redis)團隊
  • 更多產品信息,歡迎訪問官方博客:bbs.huaweicloud.com/blogs/248875

 

點擊關注,第一時間了解華為雲新鮮技術~