「开发套路系列1」:唯一 ID 生成器及实现推荐

349 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情


背景

在实际的项目开发中,我们经常需要生成唯一一串数字,在需要唯一标识一个由服务生成的 item 的时候,比如订单 id,比微信消息 id,比如用户的唯一 ID。

我们肯定不希望订单 id 重复,不希望消息与消息之间重复。

一个安全的生成唯一 ID 的算法在实际业务开发中,是绝对不必可少的。

生成算法的一般诉求

  • 生成的数字 不重复
  • 生成的数字 单调递增
  • 生成的方法 支持并发调用
  • 生成的方法 性能 高效
  • 生成的方法 存储成本 足够低
  • 生成的方法 使用成本 足够低

可能的做法

  1. 随机数
    比如用各个语言自带的随机数生成算法
  2. UUID 类
    这种也不是不行,但是它只满足上面的不重复,其它的都不太符合
  3. 数据库自增
    实际上,用数据库自带的主键生成方式,部份满足上面的需求,如果实际业务量不大,大多数的程序员就是用的数据库主键自增来搞的。不过,这样有一个坏处,有心之人可以通过 id 来判断产品的实际数据规模。另外,大规模的使用的话,数据库性能不太能跟的上。
  4. redis 自增
    实际上就使用方便程度不太滿足,其它的都还好
  5. 雪花算法 Snowflake这是 Twitter 公开的唯一生成 id 算法
  6. UidGenerator ,这是百度实现的 snowflake
  7. Leaf ,美团开源的分布式 ID 生成器,能保证全局唯一,趋势递增,依赖关系数据库、Zookeeper 等中间件。

可能是比较好的推荐做法,使用现有已经实现雪花算法的库

作为一个程序员来说,如果仅仅是需求使用,公司没有对应的基建团队,不建议去用百度或者 美团的 开源实现。因为它们太重了,维护起来太麻烦。

作为程序员,吏可能的使用是现成已经实现好的雪花算法库

雪花算法推荐的最佳推荐

sonyflake

这是 snowflake 的 go 实现,看了介绍,发现使用非常简单,只需要一步初始化,就可以在程序中需要得到随机数的地方使用

创建实例:

snowflake:=sonyflake.NewSonyflake ( sonyflake.Settings{} ),

在默认选项下,machineid取的机器ip

生成唯一ID

id,err:=snowflake.NextID()

这个库可以使用在k8s/docker环境,aws ec2等云服务器中