在高并发场景中,通常需要类似 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