Leaf分布式ID号段模式
2021-10-10 12:42:33 0 举报
分布式ID
作者其他创作
大纲/内容
DruidDataSource读取配置创建数据源
距离上次更新时间 大于30分钟 缩短max_id为原来一半,如果缩小一半后小于之前的sept,则max_id=sept
segment = buffer.getCurrent()
currentPos当前的使用的segment的index
获取读锁,拿到当前的segment 双buufer机制
UPDATE leaf_alloc SET max_id = max_id + #{step} WHERE biz_tag = #{key}
snowflake模式
segmentService.getId(key)
idGen = new SegmentIDGenImpl()
/api/segment/get/{key}获取分布式ID
启用号段模式
SegmentService
启动一个线程初始化双buufer中的另一个segment
已经初始化判断距离上次更新数据隔了多长时间
lock
threadRunning
getIdFromSegmentBuffer(cache.get(key))
updateCacheFromDb
更新号段缓存中的步长
根据业务key请求接口
非首次调,从缓存中获取自增ID
updateCacheFromDbAtEveryMinute定时读取数据库更新缓存
init()初始化操作
从mysql中加载biz_tag,然后更新到缓存
Segment[] segments双buffer
60s更新一次
idGen.get(key)
cache
如果是小于15分钟的话重新设置max_id。是原来的长的2倍,但是不能超过1000000
获取一下表中所有的biz_tag,然后更新一下本地的缓存,没有的加进去,失效的或者删除的从缓存中删除
从缓存中获取对应key的SegmentBuffer
创建Bean时构初始化构造函数
buffer = cache.get(key)
更新内存Segment的起始Id值(AtomicLong) long value = leafAlloc.getMaxId() - buffer.getStep();
如果是小于的max_id的话,就可以直接从当前segmen中返回了大于max_id时等待后台线程 更新下一个segment完成后再去获取ID
检查SegmentBuffer是否完成初始化
UPDATE leaf_alloc SET max_id = max_id + step WHERE biz_tag = #{tag}
SegmentIDGenImpl
buffer.setStep(leafAlloc.getStep()); buffer.setMinStep(leafAlloc.getStep())
if (!buffer.isInitOk())
IDAllocDaoImpl创建Dao
nextReady
首次调用,读取数据库初始化号段缓存
还未初始化
SnowflakeService
leaf-server服务
从buufer缓存获取AtomicLong自增长ID返回
订单服务
如果下个segment处于不可切换状态 并且 这个segment剩余的 id 小于了 90% 并且 线程运行状态是false
0 条评论
下一页