Docker环境下分布式ID重复的问题
容器环境下Spring-cloud微服务雪花算法弊端
调料盒
雪花算法的⼯作机器ID依赖于Mac地址+进程ID来实现唯⼀性,但是在容器环境下Mac地址和进程ID都是相同的,导致相同应⽤⽣成的⼯作机器码ID重复,存在多机器并发出现ID重复的问题 // Mybatis-plus下的Sequence.java类,采⽤5位workerId和5位datacenterId 作为雪花算法的workerId 及机器码ID
public Sequence(long workerId,long datacenterId){
c4烯烃if(workerId > maxWorkerId || workerId <0){
车辆排队长度throw new MybatisPlusException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
}
if(datacenterId > maxDatacenterId || datacenterId <0){
throw new MybatisPlusException(
String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
}
this.workerId = workerId;
this.datacenterId = datacenterId;
}
在Spring-cloud优化⽅案
如果机器码ID⽣成使⽤zookeeper来维护全局唯⼀,则需要额外维护zookeeper组件,势必会影响应⽤可⽤性。
Spring-cloud依赖注册中⼼作为必要组件,是否可以扩展注册中⼼功能,由它来维护全局机器码ID。 在应⽤启动完成时候,发起请求去注册中⼼申请唯⼀机器码ID,注册中⼼则把机器码ID存⼊Redis或其它存储结构。
tt42
坐式安全带
全方位接触机器码存储列表可采⽤Map<String,Long> , key=应⽤Ip+port , value=机器码ID
如何保证应⽤下线后使⽤过的机器码ID能够正常回收? 注册中⼼每个应⽤有⼀个扩展元数据,可以把⽣成的机器码ID存⼊到对应应⽤元数据空间,假如该节点下线则元空间数据也会被清理掉,可以采⽤定时任务⽅式,同步清理回收下线应⽤的机器码ID。
应⽤下线会发送事件通知注册中⼼,可以监听下线事件主动清理回收Redis维护的机器码ID列表,保证有⾜够的机器码ID