数据库号段模式 生成的分布式ID, 是否需要version 字段?
数据库号段模式 生成的分布式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, 然后再更新?
回答
update失败了要重试,一般重试3次就足够了,如果超出次数要抛出异常。
最好封装一个通用的重试组件,这两篇重试代码供你参考:
https://blog.csdn.net/qq_32923745/article/details/88800060
https://www.jianshu.com/p/cc7abf831900