https://github.com/wangchao550586585/common-sequence
如何设计一个分布式id生成器
设计目的
解决目前公司订单目前采用UUID的问题
方案选型
技术抉择
设计草图
目录结构
执行结果
500个线程同时创建二千万个id,步长设置为20,方便测试极端情况
核心代码
出现问题
当设置步长为100,并开启100线程时,在1这里返回-1,于是外层添加while循环,不断重试获取.
问题二:
这样设置表Name后,运行一段时间,数据库存在多条记录
分析class可得,每次运行时,LocalDateTime.now()获取的时间不一样造成的.
解决办法:
问题三:程序执行完毕后,测试代码一直运行,发现不是这里代码的问题,
解决办法:
下面是之前错误分析链路,还是挺有意思的。留着.
经过检测,发现没有死锁,线程都处于waiting状态
在此检测锁情况,也没问题
经过检测是线程池的问题,超时时间设置为1000秒,所以在此期间线程都处于等待状态,
java.util.concurrent.ThreadPoolExecutor#getTask
参考地址:https://blog.youkuaiyun.com/Nuan_Feng/article/details/106388465
这里实际上是,take()造成的阻塞,因为无界队列,所以造成核心线程永远>=wc,造成timed始终是false,所以只会走到take方法.进行无超时的阻塞.
这也好弄懂,如果wc>核心线程,那么就超时poll走,这是为了非核心线程的回收。
从下面开始,分析的链路都是错误的.
java.util.concurrent.LinkedBlockingQueue#poll(long, java.util.concurrent.TimeUnit)
参考地址:https://blog.youkuaiyun.com/Nuan_Feng/article/details/106971925
java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObject#awaitNanos