# 全局Sequence **Repository Path**: zoomtech/global-sequence ## Basic Information - **Project Name**: 全局Sequence - **Description**: 不连续全局发号器,全局唯一、支持分布式系统,支持dubbo调用 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-01-03 - **Last Updated**: 2025-01-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: sequence, 发号器, 分布式唯一ID ## README # 致用全局sequence(发号器) ### 目录 * 简介 * 性能 * 可用性 * 特性 * 应用场景 * 代码接⼊ * SQL初始化 * 运行说明 ## 简介 基于滴滴(Tinyid)改造成了简易的全局sequence发号器。核心原理就是每个业务系统启动时从全局sequence表预占⼀个号段, 然后再内存中实现原⼦分配唯⼀sequence的操作,当号段快使用完时,自动从调用远端RPC发号器服务拉取下⼀个可用的唯⼀号段(滴滴只 提供了HTTP类型的远程获取号段接⼝,现改为性能更好的RPC远程获取号段接口)。 ## 性能 由于本地获取sequence是在内存中获取,性能非常高,可以达到纳秒级;当本地号段使用完后,远程获取号段也是基于rpc调用获取也 非常快,耗时⼀般在20ms内。 sequence号段初始化sql,可以指定每次拉取号段的步长,理论上步长越长,并发生成sequence的性能就越高,但浪费也就越多,正常 业务步长设置为500~1000即可。 ![输入图片说明](%E8%A1%A8%E7%BB%93%E6%9E%84.png) ## 可用性 依赖db,当db不可用时,因为客户端有缓存,所以还可以使用⼀段时间。后面有需要还可以配置多个db,只要有1个db存活,服务就可 用。 ## 特性 * 全局唯⼀的long型id * 趋势递增的id,即不保证下⼀个id⼀定比上⼀个⼤ * 非连续性 * 支持批量获取id(最⼤250个) * 支持生成1,3,5,7,9...序列的id ## 应用场景 适用场景 : 只关心id是数字、唯⼀,趋势递增的系统,可以容忍id不连续,有浪费的场景 不适用场景 : 必须ID连续,严格递增 ## 代码接⼊ * 1、maven依赖 ``` com.zhiyong.saas global-sequence-starter 1.0.0-SNAPSHOT ``` * 2、application.properties 添加如下配置 ``` #dubbo默认配置 dubbo.registry.protocol=zookeeper dubbo.registry.address=192.168.16.225:2181 dubbo.provider.protocol.version=1.0.0 #当前业务默认使用的sequence名称 zhiyong.default.sequence.name=global_sequence ``` ## SQL初始化 执行项目根目录下的init.sql ## 运行说明 * 下载项目 * 处理以下几个核心配置 * 初始化数据库脚本执行 init.sql * 修改初始化系统配置(mysql、zk连接配置) global-sequence-server/src/main/resources/application.yml * 启动全局sequence服务端 * 运行global-sequence-server模块下的com.zhiyong.saas.server.Application类启动项目 * 需要使用全局sequence的依赖方,pom依赖global-sequence-starter * 代码注入: ``` #注⼊sequenceId @Resource private SequenceId sequenceId; #方法调用 ①sequenceId.next();//从配置的默认sequence中获取1个sequenceId ②sequenceId.next(100);//从配置的默认sequence中批量获取100个sequenceId ③sequenceId.next("study");//从指定sequence中获取1个sequenceId ④sequenceId.next("study", 100);//从指定sequence中批量获取100个sequenceId ``` ## 平台作者 ### 毛军锐 VX:ybyh8899