Snowflake powered by Redis or Zookeeper
雪花 id 算法需要配置 dataCenterId 和 workerId,分别都是 5 位,两项加起来是 10,范围是 2 ^ 10 = 1024; 可以简化处理,两个参数简化为一个,使用下面的依赖,
<dependency>
<groupId>com.relops</groupId>
<artifactId>snowflake</artifactId>
<version>1.1</version>
</dependency>
int node = 0;
Snowflake snowflake = new Snowflake(node);
node 的范围建议 0~1023
在集群部署环境,多台服务器肯定是不能用同一个 node 参数的,比较简单想到的方案就是根据服务器的 ip 地址分配,不过需要首先知道所有服务器的 ip 地址,不过这样的方案是无法支持服务器扩容的,也不支持容器化部署的方式;
假设服务器数量不超过 10 个,版本迭代大约所有服务器都会重新部署,想办法让每次部署都获取新的 node,因为只要是新的就不会存在冲突,
方案 1, 使用 Redis 的 increment 原子性操作,然后对 1024 取模即为新分配的 node,想象 1024 数字环,当新部署服务器获得余数再次出现 0 时,原来其他的服务器获取的 node 要比 0 大很多,千数量级比个位数数量级的差距还是足够我们使用的;
方案 2, 使用 Zookeeper 的 SEQUENTIAL 模式创建节点,获得序列值然后也是对 1024 取模处理,基本与方案 1 相同。
方案2优化了一下,使用PERSISTENT_SEQUENTIAL创建模式,比较ip:port是否已经存在,存在就使用原来的序号;