SegmentIDGenImpl的get方法里用synchronized+dubble check,在部署多台leaf服务时,这种锁会失效吧?
SegmentIDGenImpl的get方法里用synchronized+dubble check,在部署多台leaf服务时,这种锁会失效吧?
@zztztt if (!buffer.isInitOk()) { synchronized (buffer) { if (!buffer.isInitOk()) {
你的意思是不同的Leaf服务生产同一个ID?不会啊,每个服务的 号码段都不一样的
每台leaf服务器只加载一次,数据库中有行锁保证
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();
这样就解决了多机部署问题。
其实官方的图挺清晰的:
