
滴滴的分布式ID生成器(Tinyid),好用的一批
不了解分布式ID生成器的同学,先复习一下之前的 《9种分布式ID生成方式》
Tinyid
是滴滴开发的一款分布式ID系统,Tinyid
是在美团(Leaf)
的leaf-segment
算法基础上升级而来,不仅支持了数据库多主节点模式,还提供了tinyid-client
客户端的接入方式,使用起来更加方便。但和美团(Leaf)不同的是,Tinyid只支持号段一种模式不支持雪花模式。
Tinyid的特性
- 全局唯一的long型ID
- 趋势递增的id
- 提供 http 和 java-client 方式接入
- 支持批量获取ID
- 支持生成1,3,5,7,9...序列的ID
- 支持多个db的配置
适用场景:只关心ID是数字,趋势递增的系统,可以容忍ID不连续,可以容忍ID的浪费
不适用场景:像类似于订单ID的业务,因生成的ID大部分是连续的,容易被扫库、或者推算出订单量等信息
Tinyid原理
Tinyid
是基于号段模式实现,再简单啰嗦一下号段模式的原理:就是从数据库批量的获取自增ID,每次从数据库取出一个号段范围,例如 (1,1000]
代表1000个ID,业务服务将号段在本地生成1~1000
的自增ID并加载到内存.。
Tinyid
会将可用号段加载到内存中,并在内存中生成ID,可用号段在首次获取ID时加载,如当前号段使用达到一定比例时,系统会异步的去加载下一个可用号段,以此保证内存中始终有可用号段,以便在发号服务宕机后一段时间内还有可用ID。
原理图大致如下图:
Tinyid实现
Tinyid
的GitHub地址 : https://github.com/didi/tinyid.git
Tinyid
提供了两种调用方式,一种基于Tinyid-server
提供的http方式,另一种Tinyid-client
客户端方式。 不管使用哪种方式调用,搭建Tinyid
都必须提前建表tiny_id_info
、tiny_id_token
。
tiny_id_info
表是具体业务方号段信息数据表
max_id
:号段的最大值
step
:步长,即为号段的长度
biz_type
:业务类型
号段获取对max_id
字段做一次update
操作,update max_id= max_id + step
,更新成功则说明新号段获取成功,新的号段范围是(max_id ,max_id +step]
。
tiny_id_token
是一个权限表,表示当前token可以操作哪些业务的号段信息。
修改tinyid-server
中 \offline\application.properties
文件配置数据库,由于tinyid
支持数据库多master
模式,可以配置多个数据库信息。启动 TinyIdServerApplication
测试一下。
1、Http方式
tinyid
内部一共提供了四个http
接口来获取ID和号段。
nextId
、nextIdSimple
都是获取下一个ID,nextSegmentIdSimple
、getNextSegmentId
是获取下一个可用号段。区别在于接口是否有返回状态。
2、Tinyid-client
客户端
如果不想通过http方式,Tinyid-client
客户端也是一种不错的选择。
引用 tinyid-server
包
启动 tinyid-server
项目打包后得到 tinyid-server-0.1.0-SNAPSHOT.jar
,设置版本 ${tinyid.version}
为0.1.0-SNAPSHOT。
在我们的项目 application.properties
中配置 tinyid-server
服务的请求地址 和 用户身份token
在Java代码调用TinyId
也很简单,只需要一行代码。
Tinyid
整个项目的源码实现也是比较简单,像与数据库交互更直接用jdbcTemplate实现
总结
两种方式推荐使用Tinyid-client
,这种方式ID为本地生成,号段长度(step
)越长,支持的qps
就越大,如果将号段设置足够大,则qps可达1000w+。而且tinyid-client
对 tinyid-server
访问变的低频,减轻了server端的压力。
文章转载自公众号:程序员小富
