Leaf icon indicating copy to clipboard operation
Leaf copied to clipboard

SegmentIDGenImpl的get方法里用synchronized+dubble check,在部署多台leaf服务时,这种锁会失效吧?

Open xukun8272 opened this issue 5 years ago • 4 comments

SegmentIDGenImpl的get方法里用synchronized+dubble check,在部署多台leaf服务时,这种锁会失效吧?

xukun8272 avatar Sep 28 '20 10:09 xukun8272

@zztztt if (!buffer.isInitOk()) { synchronized (buffer) { if (!buffer.isInitOk()) {

xukun8272 avatar Sep 29 '20 01:09 xukun8272

你的意思是不同的Leaf服务生产同一个ID?不会啊,每个服务的 号码段都不一样的

roganding avatar Apr 13 '21 15:04 roganding

每台leaf服务器只加载一次,数据库中有行锁保证

olio09 avatar May 13 '21 02:05 olio09

SegmentIDGenImpl.updateSegmentFromDb()是每个segment初始化的时候要去执行的。里面有这样的逻辑: if (!buffer.isInitOk()) { leafAlloc = dao.updateMaxIdAndGetLeafAlloc(key); buffer.setStep(leafAlloc.getStep()); buffer.setMinStep(leafAlloc.getStep());//leafAlloc中的step为DB中的step } 初始化(仅执行一次)segment的buffer的时候,这块的updateMaxIdAndGetLeafAlloc就是更新db的max = max + step. 所以,多机起来的时候,同一个biztag的segment后面的机器的maxid都会比前一个大一个step. 同时,后面在set的Value是这样的: long value = leafAlloc.getMaxId() - buffer.getStep(); 这样就解决了多机部署问题。 其实官方的图挺清晰的: image

zhichaoleo avatar Sep 02 '22 09:09 zhichaoleo