业务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已经是线程安全。