背景
在应用程序中,经常需要全局唯一的ID作为数据库主键。
我们需要什么样的ID生成器
- 高性能 -> 1.生成性能高 2.插入性能高 3.索引性能高
- 高可用 -> 1.依赖中间件要少 2.避免单节点问题
- 不重复 -> 1.集群内全局不重复
- 易使用 -> 1.接入简单 2.零学习成本
- 语义性 -> 1.ID带有一些其它信息
如何满足这几点要求
- 生成性能高 -> 大多数时间为内存分配,减少IO,减少锁
- 插入性能高 -> 全局递增,避免页分裂
- 索引性能高 -> 数值类型
- 全局不重复 -> 分布式一致性
- 服务高可用 -> 减少依赖中间件,减少中间件交互时间
总结特性
- 全局递增
- 数字类型
- 全局唯一
- 无锁并发
- 内存分配
- 单机生成(大多数时间)
SnowFlake
Twitter把存储系统从MySQL迁移到Cassandra,因为Cassandra没有顺序ID生成机制,所以开发了这样一套全局唯一ID生成服务。Ray的基本思想来自于SnowFlake,解决了一些SnowFlake中存在的一些问题