首页 新闻 会员 周边

数据库号段模式 生成的分布式ID, 是否需要version 字段?

0
[已解决问题] 解决于 2022-04-16 16:04

数据库号段模式 生成的分布式ID, 确实可以保证唯一性,但是,它的缺点能够视而不见吗?

它的作用是一个客户端一次性获取一个号段,但很明显是, 没法保证分布式ID 的全局递增, 也就是没法保证全局有序,而且, 如果客户端越多,那么就越是乱序,而且 如果客户端重启,那么 可能会有很多号段没有使用完, 造成浪费。

这个问题有解吗? 我看到有的地方使用了 version 字段,version 确实可以保证有序,如:
<pre>
等这批号段ID用完,再次向数据库申请新号段,对max_id字段做一次update操作,update max_id= max_id + step,update成功则说明新号段获取成功,新的号段范围是(max_id ,max_id +step]。

update id_generator set max_id = #{max_id+step}, version = version + 1 where version = # {version} and biz_type = XXX
由于多业务端可能同时操作,所以采用版本号version乐观锁方式更新,这种分布式ID生成方式不强依赖于数据库,不会频繁的访问数据库,对数据库的压力小很多。
</pre>

但是如果update 失败了呢? update 难道就不更新了吗? 或者就是一直等待吗? 难道只能一个客户端更新吗? 还是重新获取version, 然后再更新?

CanntBelieve的主页 CanntBelieve | 初学一级 | 园豆:34
提问于:2021-04-19 06:17
< >
分享
最佳答案
0

update失败了要重试,一般重试3次就足够了,如果超出次数要抛出异常。

最好封装一个通用的重试组件,这两篇重试代码供你参考:
https://blog.csdn.net/qq_32923745/article/details/88800060
https://www.jianshu.com/p/cc7abf831900

奖励园豆:5
编码专家 | 菜鸟二级 |园豆:209 | 2022-03-11 11:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册