UGC全局变量设计思路
目录
UGC 全局变量设计思路
需求
- 策划需要一个属于UGC地图的全局变量,来自于不同space的玩家游玩同一张地图可以获取和修改这个变量。
遇到的问题
-
玩家A B C 来自不同的Game/Space 同时修改或读取这个变量, 会导致数据可能覆盖或丢失。举例:假设A修改变量X后,玩家B Space内缓存有修改前的值,此时玩家B也提出修改 并且基于缓存前的值,此时玩家B发出请求给stub(存有变量的位置),会导致A修改的变量X丢失,变成玩家B修改的变量。
-
属于分布式系统中常见的数据一致性问题。
- 丢失更新 (多个并发写操作,后提交的操作覆盖了前一次的有效更新)
- 过期读取(玩家没有获取到最新的变量值)
解决方案
- 基于全局变量本身的使用特性,其冲突率一般较低,属于读多写少的应用场景。采取乐观锁+MVCC的设计思路解决。
- UgcGamelogic (以下称之为Client),在Game开始时load全局变量的值,并再后续过程中周期性更新全局变量的值。(缓解过期读取问题)
- 每个变量均设置Version, 更新流程如下
- 读取变量时,先获取变量的Version,并保存到本地变量中。
- 更新变量时,假设版本不冲突,更新local缓存变量,发送请求至Stub
- Stub收到请求,先获取变量的Version,并判断是否冲突。
- 冲突则返回错误,并返回最新的值
- client 收到错误和最新的值,更新本地缓存
- 不冲突则更新变量,并返回成功