业务unique ID的生成策略分析

阅读更多

 

业务unique ID的生产策略分析

 

需求上下文:

 

业务是和单个user相关的(userId),业务表分到10个DB host中

 

 

 需求:

 高并发下生产唯一的业务ID

 

 

首先根据此用户的userId mapping到不同的DB host(oracle), 

 

每个DB host上有一个业务seq,  这个seq自增步长是10,然后每个host起点不一样, 0 是0, 1是1,这样每个 DB host生成的seq数据就不会冲突(host1上只会生产尾数为1的seq,host2上只会生产尾数为2的seq,类推)

 

具体生产seq的oracle sql为:

 

SELECT  BUSINESS_ID_SEQ_0.NEXTVAL FROM dual   //生成一个

 

SELECT  BUSINESS_ID_SEQ_0.NEXTVAL FROM dual CONNECT BY LEVEL <= 100  //生成100个

 

 

查询的时候每次seq生成100个,缓存到本地内存中的队列(ConcurrentLinkedQueue), 下次就从内存中取了

 

但这个code中的synchronized锁加的很奇怪, ConcurrentLinkedQueue是在锁的代码块内部使用的, 但如果上下文环境是安全的,ConcurrentLinkedQueue这个高并发队列不就没意义了吗,

 

个人觉得加锁应该只加在从数据库拿100个seq的时候加,防止多个线程同时去数据库创建100个seq,导致重复创建。在那之外的获取seq其实不用加锁的,因为ConcurrentLinkedQueue已经是线程安全。

你可能感兴趣的:(业务unique ID的生成策略分析)