游戏服务器分布式ID设计

本文结合游戏的特点对分布式ID进行设计,以方便游戏系统对ID空间的需求。

(一)分布式ID

改进雪花算法:
1、去掉符号位
2、41位时间戳:表示从起始时间到当前时间的毫秒数,支持约69年的时间范围。
3、11-13位机器ID:可支持2048-8492个节点(进程),只有登录服和游戏需要配置机器ID,即一个区需要最少两个机器ID,区服数量范围1024-4096。
4、10-12位序列号:用于同一毫秒内的ID请求,支持每毫秒生成1024-4096个唯一ID(即每个游戏服进程1毫秒最多可以生产ID的范围是1024-4096只怪物或物品),低概率会超过上限(超过时也是低概率的等待1毫秒,完全可以接受)。

注:可以根据实际需求通过配置来调整机器ID和序列号的空间比例。

如:一个版本的游戏最多同时允许1024个区(2048个机器ID需求),那么每个游戏服最多1毫秒可以生产4096只怪物或物品。

(二)用户ID与角色ID

用户ID与角色ID使用GUID字符串形式(StrId),它不向客户端开放,只用于低频的数据库索引、日志等。

(三)实体ID

角色、物品、怪物、NPC等游戏实体都有实体ID(EntityID)或实例ID(InsId),利用分布式ID生成临时的动态ID做EntityID,不保存,只用于客户和服务端高频索引用。
角色每次上线由登录服分配EntityID,在本服、跨服在同次登录期间保持一致。

(四)优点

1、高频64位ID哈希查表效率高。
2、无需向客户端公开角色ID(StrId),安全性好。
3、无运行时钟校时导致时间回拨的顾虑。
4、无重启期间时钟校时导致时间回拨的顾虑。

注:当上次生产ID时保存的时间戳大于当前时间戳时,用上次时间戳来生产ID即可,无需持久化。

posted @ 2025-05-02 22:57  码客-ygluu  阅读(57)  评论(0)    收藏  举报