在高并发场景中,通常需要类似 MySQL 自增 id 一样不断增长且不会重复的 id。

比如某电商双 11 时,在 0:00 开始,会有千万到亿级的订单涌入,每秒要处理 10w+ 的订单。在将订单插入数据库前,我们需要给订单一个唯一的 id 再插入数据库内。也正因为订单量大,一个无意义的纯数字 id 在对数据库进行增删改查时不能起到优化作用。此 id 内应该包含一些时间信息,这样即使后端的系统对消息进行了分库分表,也能够以时间顺序对这些消息进行排序。

Twitter 的 snowflake 算法是这种场景下的一个典型解法,原理如图:

首先确定的是,id 数值长度是64位,int64 类型,被分为四个部分(不含开头的符号 / unused ):

  • 41 位来表示收到请求时的时间戳,单位为毫秒
  • 5 位表示数据中心的 id
  • 5 位表求机器的实例 id
  • 12 位为循环自增 id
    • 到达1111,1111,1111后归0

这样的机制可以支持一台机器在一毫秒内能够产生4096条消息。一秒共 409.6w 条消息。从值域上来讲完全够用。

数据中心 id 加上实例 id 共有 10 位,每个数据中心可以部署 32 台实例,搭建 32 个数据中心,所以可以一共部署 1024 台实例。

41 位的时间戳(毫秒为单位)能够使用 69 年。

最后编辑: kuteng  文档更新时间: 2022-03-29 17:58   作者:kuteng