摘要:数据副本强一致、全节点可写、存储全面降本,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,怎么解?相关推荐

  1. 那些年,我在游戏开发中改过的bug:靠不住的OS和SDK

    记忆中有很多次了,几个程序员朋友聊天,聊着聊着,就聊到自己遇到过的bug.然后大家开始口沫横飞交流那些或诡异或神奇的bug,谈论自己当年是如何搞定bug或是被bug搞定. 正好看见Gamesutra上 ...

  2. 【iOS-Cocos2d游戏开发之十五】详解CCProgressTimer 进度条并修改cocos2d源码实现“理想”游戏进度条!...

    为什么80%的码农都做不了架构师?>>>     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigam ...

  3. WWDC15 iOS游戏开发3个新框架全解

    简介 在此次WWDC的游戏相关视频中,苹果再一次展现了它非凡的技术整合和持续创新能力.除了继续完善已有的2D游戏框架SpritKit, 3D游戏框架SceneKit和全新的图形渲染API Metal ...

  4. 那些年,我在游戏开发中改过的bug:坑爹的Vista与中间件

    继续说那些奇葩的Bug. 靠不住的系统组件:Vista和Speech Recogition 我们游戏使用了语音识别,使用了DirectX里面的XAudio来采集声音.Windows Vista里面有一 ...

  5. cocos2d for python_Python版的cocos2d库:一个2D游戏开发GUI框架的入门详解

    1 说明: ===== 1.1 cocos2d是一个基于MIT协议的开源框架,用于构建游戏.应用程序和其他图形界面交互应用. 1.2 不逊色于pygame,但是其实 Python版的cocos2d库是 ...

  6. 【Android游戏开发十七】让玩家自定义手势玩转Android游戏!

    本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/android-game/340.html   ...

  7. 【iOS-Cocos2d游戏开发】系列(总结了多篇文章,可以好好学习

    最近几天仔细了解了iOS游戏开发引擎,常用的cocos2d,Unity引擎,那么Unity是非免费的,而cocos2d则是免费开源的: 最后促使我选择cocos2d的原因有两点: 1.最重要的原因是它 ...

  8. 【Android游戏开发十七】让玩家自定义手势玩转Android游戏!—Android Gesture之【输入法手势技术】...

    为什么80%的码农都做不了架构师?>>>     李华明Himi 原创,转载务必在明显处注明: 转载自 [黑米GameDev街区] 原文链接:  http://www.himigam ...

  9. 【Android游戏开发十七】让玩家自定义手势玩转Android游戏!—Android Gesture之【输入法手势技术】

    Himi  原创, 欢迎转载,转载请在明显处注明! 谢谢. 原文地址:http://blog.csdn.net/xiaominghimi/archive/2011/01/14/6137136.aspx ...

  10. 降低游戏陪玩平台系统前端开发复杂度的方式详解

    优秀的程序员总是能优雅的组织自己的代码,编写思路清晰,组织结构划分合理,从小的功能组件,到大的模块结构,都能通过合理巧妙的搭配,化复杂为简单,并且提升游戏陪玩平台系统运行效率,提高游戏陪玩平台系统代码 ...

最新文章

  1. 三面腾讯,已拿offer
  2. BizTalk开发系列(二十三) BizTalk性能指标参考
  3. boost::hana::unfold_left用法的测试程序
  4. [设计模式] ------ 观察者模式和他的升级版发布订阅模式
  5. java日志系统简介: 从tomcat大量打印debug日志说起
  6. 将品牌机预装的 Windows 7 家庭版升级为 Windows 7 旗舰版的超级简单方法
  7. Rhino(犀牛) 7.22安装教程附带安装包
  8. 联想Y7000安装显卡驱动
  9. Tipask目录结构
  10. 山东海王星·关于国内文旅水上乐园的运营营销构思
  11. C语言中,开3次方用什么?
  12. git diff:Linux使用meld做git的diff工具
  13. node koa解析excel表格 .xlsx .xls
  14. ArcGIS API for Silverlight 绘制降雨路径动画
  15. Java写的十六进制转十进制和Ascii工具
  16. OFO和摩拜共享单车
  17. Unity3d 技巧(4)-如何配置JavaHome
  18. 《Swf文件的那些事》—as函数跨平台的交互详解
  19. 目标检测论文阅读:EfficientDet算法笔记
  20. DC-DC升压降压变换原理

热门文章

  1. 超详细讲解:数据库的备份与数据恢复方法举例与说明(完全备份、差异备份、增量备份)
  2. android 光晕动画,充电动画软件下载
  3. div+css静态网页设计——男女装商城-功能齐全(40页) HTML+CSS+JavaScript 大学生网店作品 商城网页设计作业模板 学生网页制作源代码下载
  4. jeecms系统使用介绍——jeecms中的内容、栏目、模型之间的关系
  5. 计算机itunes无法安装,Win7电脑无法安装itunes怎么办 win7安装itunes失败的解决方法...
  6. Broken Pipe
  7. 数学四大思想八大方法_你不可不知的数学四大思想方法
  8. java 日期 中文_JAVA的时间类型转换为中文大写方法
  9. 史蒂夫·保罗·乔布斯
  10. colorbox 自适应 高度