目录

UGC全局变量设计思路

UGC 全局变量设计思路

需求

  • 策划需要一个属于UGC地图的全局变量,来自于不同space的玩家游玩同一张地图可以获取和修改这个变量。

遇到的问题

  • 玩家A B C 来自不同的Game/Space 同时修改或读取这个变量, 会导致数据可能覆盖或丢失。举例:假设A修改变量X后,玩家B Space内缓存有修改前的值,此时玩家B也提出修改 并且基于缓存前的值,此时玩家B发出请求给stub(存有变量的位置),会导致A修改的变量X丢失,变成玩家B修改的变量。

  • 属于分布式系统中常见的数据一致性问题。

    • 丢失更新 (多个并发写操作,后提交的操作覆盖了前一次的有效更新)
    • 过期读取(玩家没有获取到最新的变量值)

解决方案

  • 基于全局变量本身的使用特性,其冲突率一般较低,属于读多写少的应用场景。采取乐观锁+MVCC的设计思路解决。
  1. UgcGamelogic (以下称之为Client),在Game开始时load全局变量的值,并再后续过程中周期性更新全局变量的值。(缓解过期读取问题)
  2. 每个变量均设置Version, 更新流程如下
    • 读取变量时,先获取变量的Version,并保存到本地变量中。
    • 更新变量时,假设版本不冲突,更新local缓存变量,发送请求至Stub
    • Stub收到请求,先获取变量的Version,并判断是否冲突。
    • 冲突则返回错误,并返回最新的值
    • client 收到错误和最新的值,更新本地缓存
    • 不冲突则更新变量,并返回成功