日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

游戏开发常遇到数据一致性BUG,怎么解?

發布時間:2023/12/18 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 游戏开发常遇到数据一致性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

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

總結

以上是生活随笔為你收集整理的游戏开发常遇到数据一致性BUG,怎么解?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。