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){
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(管理ip
String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
}510669
this.workerId = workerId;
this.datacenterId = datacenterId;
}
在Spring-cloud优化⽅案
如果机器码ID⽣成使⽤zookeeper来维护全局唯⼀,则需要额外维护zookeeper组件,势必会影响应⽤可⽤性。 Spring-cloud依赖注册中⼼作为必要组件,是否可以扩展注册中⼼功能,由它来维护全局机器码ID。 sds聚丙烯酰胺凝胶电泳在应⽤启动完成时候,发起请求去注册中⼼申请唯⼀机器码ID,注册中⼼则把机器码ID存⼊Redis或其它存储结构。
电脑切换器
机器码存储列表可采⽤Map<String,Long> , key=应⽤Ip+port , value=机器码ID
如何保证应⽤下线后使⽤过的机器码ID能够正常回收?抽纸机
注册中⼼每个应⽤有⼀个扩展元数据,可以把⽣成的机器码ID存⼊到对应应⽤元数据空间,假如该节点下线则元空间数据也会被清理掉,可以采⽤定时任务⽅式,同步清理回收下线应⽤的机器码ID。
应⽤下线会发送事件通知注册中⼼,可以监听下线事件主动清理回收Redis维护的机器码ID列表,保证有⾜够的机器码ID