imadcn/idworker

ImadcnIdentifierGenerator 依然存在主键重复的情况

Closed this issue · 3 comments

`@Configuration
@EnableConfigurationProperties(IdProperties.class)
public class IdAutoConfigure {

@Autowired
private IdProperties  properties;

@Bean
public IdentifierGenerator getIdentifierGenerator(){
    return new ImadcnIdentifierGenerator(properties.getZookeeperAddr()+":"+properties.getPort());
}

}

@test
public void test() {
while(true) {
UmsUser user = new UmsUser();
user.setEmail("xxx@qq.com");
user.setNickname("lisi");
long start = System.currentTimeMillis();
mapper.insert(user);
long end = System.currentTimeMillis();
System.out.println(end - start);
} `
a951c7f2ac73fcbe866ccef747c8ff7

注册时,系统会依赖本地节点缓存的信息,可以在你截图上看到,默认 /tmp/idworker/default.cache。当一个应用在同一路径启用多个实例,会“共享”的读取同一缓存,workerId会分配为同一值,导致id“重复”。

see

private boolean checkNodeInfo(NodeInfo localNodeInfo, NodeInfo zkNodeInfo) {

欢迎提供PR来新增feature

缓存配置默认 /tmp/idworker/default.cache。当一个应用在同一路径启用多个实例,会“共享”的读取同一缓存,workerId会分配为同一值,导致id“重复”。
我目前是修改了配置路径,各个应用都有自己独立的路径,但是各个应用启动后依然 workerId 都为 0 ,所以依然会有重复问题。

imadcn commented

如果每个应用是独立的group name,那么idworker的nodeid会独立计算
如果想要不同应用,共享同一id生成算法,请配置相同的group name,

参考配置文档 中,group 说明
https://github.com/imadcn/idworker#idworkergenerator--id生成策略配置
https://github.com/imadcn/idworker#generatorsnowflake--生成策略--snowflake模式