游戏后台生成唯一ID
MMO游戏后台通常需要由大量服务器来共同承载海量玩家,虽然玩家可能分布在不同的游戏大区,但是他们可能会通过跨服等等方式进行各种交互。游戏中的角色,装备,物品等需要生成一个全局唯一ID标识,便于辨别不同玩家,不同装备,也方便定位外网问题。
常见的分布式全局唯一ID生成方式包括使用数据库自增,使用Redis的原子操作INCR和INCRBY,使用UUID,SnowFlake算法等等。前面两种方式均需要产生一次异步调用,在MMO中,海量玩家会集中在一个场景中进行PK,做任务,打怪等,场景内业务逻辑复杂,为了降低编码复杂度,减少BUG几率,通常会选择使用本地算法来生成全局唯一ID。
UUID方式生成的ID比较长,通常需用字符串表示,作为内存数据主键或者数据库主键它的查找效率比不上直接使用整数类型生成的ID做主键。同时它对业务来说是一串无规则的字符串,不能根据相关业务规则进行调整。
SnowFlake算法是开源的分布式生成算法,它是一个本地生成算法,它可以生成一个位的整数,具体生成的位结构如下图:
SnowFlake算法12位序列号支持一个节点同一毫秒内产生4096个ID,一秒内可以产生400多万个UID,其41位的时间戳可以使用69年。
下面讲述一种MMO中的分布式ID生成方式,它会生成一个64位的整数ID,核心思想与SnowFlake类似。同时会根据游戏的特性对64位ID中的位