分布式主键生成策略
程序员文章站
2022-07-12 10:51:23
...
最近工作中需要手动生成主键,由于是分布式应用,多个应用对多个数据源进行操作,结构图如下:
一个逻辑表可能sharding到多个数据库中,但是要保证在多个数据库中每一个记录的主键不能重复,利用数据库自身的自增策略已经不能满足需求。
借鉴IP网络的划分,可以将一段连续的序列切分为多个子序列,以1-20000000为例,切分长度为100000,可以切分为200个子序列,分别为:
001 | 000001-100000 |
002 | 100001-200000 |
003 | 200001-300000 |
n | (n-1)*100000+1-n*1000000 |
200 | 19900001-20000000 |
把001、002、...、200看成网络号,对应的取值范围成为主机号。然后可以将这些网络号分配给不同的应用程序A、B:
1、A启动,检查配置文件中分配给自己的网络号(假如为001、002、003)和切分长度
2、连接数据库组,查询当前数据库主键在001段区间的最大值,如果该值到达001段的结尾,继续查询在002段区间的最大值,直到找到区间最大值不在该区间末尾的值,设该值为currentMaxValue
3、创建一个AtomicInteger,初始值为currentMaxValue,为上层提供主键生成服务
4、当AtomicInteger增长到当前区间的末尾时,转换到下一个分配的区段
如果为每个应用分配不重合的区间,每个应用都能生成区间连续的主键,各个应用之间也不会出现生成主键重复的现象。很好的解决了分布式情况下的主键生成问题,不需要应用之间协调,只需要预先规划分配一下区段即可。
上一篇: jbpm启动流程实例
下一篇: Eclipse中如何添加Jbpm插件