持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
背景
在实际的项目开发中,我们经常需要生成唯一一串数字,在需要唯一标识一个由服务生成的 item 的时候,比如订单 id,比微信消息 id,比如用户的唯一 ID。
我们肯定不希望订单 id 重复,不希望消息与消息之间重复。
一个安全的生成唯一 ID 的算法在实际业务开发中,是绝对不必可少的。
生成算法的一般诉求
- 生成的数字 不重复
- 生成的数字 单调递增
- 生成的方法 支持并发调用
- 生成的方法 性能 高效
- 生成的方法 存储成本 足够低
- 生成的方法 使用成本 足够低
可能的做法
- 随机数
比如用各个语言自带的随机数生成算法 - UUID 类
这种也不是不行,但是它只满足上面的不重复,其它的都不太符合 - 数据库自增
实际上,用数据库自带的主键生成方式,部份满足上面的需求,如果实际业务量不大,大多数的程序员就是用的数据库主键自增来搞的。不过,这样有一个坏处,有心之人可以通过 id 来判断产品的实际数据规模。另外,大规模的使用的话,数据库性能不太能跟的上。 - redis 自增
实际上就使用方便程度不太滿足,其它的都还好 - 雪花算法 Snowflake这是 Twitter 公开的唯一生成 id 算法
- UidGenerator ,这是百度实现的 snowflake
- Leaf ,美团开源的分布式 ID 生成器,能保证全局唯一,趋势递增,依赖关系数据库、Zookeeper 等中间件。
可能是比较好的推荐做法,使用现有已经实现雪花算法的库
作为一个程序员来说,如果仅仅是需求使用,公司没有对应的基建团队,不建议去用百度或者 美团的 开源实现。因为它们太重了,维护起来太麻烦。
作为程序员,吏可能的使用是现成已经实现好的雪花算法库
雪花算法推荐的最佳推荐
这是 snowflake 的 go 实现,看了介绍,发现使用非常简单,只需要一步初始化,就可以在程序中需要得到随机数的地方使用
创建实例:
snowflake:=sonyflake.NewSonyflake ( sonyflake.Settings{} ),
在默认选项下,machineid取的机器ip
生成唯一ID
id,err:=snowflake.NextID()
这个库可以使用在k8s/docker环境,aws ec2等云服务器中