一种分布式系统下的自增主键实现方法

[size=medium]在分布式系统中大多数存在着如下的架构形式:[/size]

[img]http://dl.iteye.com/upload/attachment/0068/6014/f7ecb382-492a-3153-8275-2499df1ebb9c.jpg[/img]

系统的被逻辑分为前台应用和数据库两个部分,前台应用通过统一的数据访问层对数据库进行读写操作,前台应用会部署在多台机器上,数据库系统则采用分库分表的形式进行部署。

由此引发的一个问题是,当需要对一个逻辑上的表TABLE1(物理上被分为多个表,形如:TABLE1_0000,TABLE1_0001)采用统一的自增主键时,则会遇到困难,因为采用了分表的策略将无法采用数据库自带的主键生成机制(采用数据库自增主键将使得每张物理表的主键彼此独立)。

在此提供一个分布式的主键生成方案:

1.使用独立的一张表保存,如ids来保存最小未被使用的id值,该表每条记录对应一个业务表的id使用,该表有两个字段key, value, key对应于每个业务表,value是相应的id值
2.每当前台应用初始化的时候,就从该表中读取出value,同时将value + 100后写回ids表中。(表示从value - value+99(该值可以根据实际情况进行设置,越大值回写数据的操作越少,但是若应用启动频繁则id浪费较多) 这个区间内的id值将由该台应用独自使用)。
3.使用两个变量来辅助ID的生成,nextId:下一个Id的值, maxId:当前允许的最大Id,当有生成Id请求时,首先判断 nextId > maxId,若条件成立,则重新执行2中的步骤从ids表中读取并更新value,然后将value赋值给nextId,将maxId赋值为value+99,将nextId加一,并返回旧的nextId的值。(注:增加nextId值的时候需要进行线程同步)

[img]http://dl.iteye.com/upload/attachment/0068/6097/1475969d-d3c2-3440-950b-1180fc4a5ef9.jpg[/img]

你可能感兴趣的:(JAVA)