V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
Honwhy
V2EX  ›  分享创造

一种自动配置雪花 id 算法参数的方法

  •  
  •   Honwhy · 2020-05-08 23:50:20 +08:00 · 2109 次点击
    这是一个创建于 1693 天前的主题,其中的信息可能已经有所发展或是发生改变。

    id-demo

    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 参数难题

    在集群部署环境,多台服务器肯定是不能用同一个 node 参数的,比较简单想到的方案就是根据服务器的 ip 地址分配,不过需要首先知道所有服务器的 ip 地址,不过这样的方案是无法支持服务器扩容的,也不支持容器化部署的方式;

    假设服务器数量不超过 10 个,版本迭代大约所有服务器都会重新部署,想办法让每次部署都获取新的 node,因为只要是新的就不会存在冲突,

    方案 1, 使用 Redis 的 increment 原子性操作,然后对 1024 取模即为新分配的 node,想象 1024 数字环,当新部署服务器获得余数再次出现 0 时,原来其他的服务器获取的 node 要比 0 大很多,千数量级比个位数数量级的差距还是足够我们使用的;

    方案 2, 使用 Zookeeper 的 SEQUENTIAL 模式创建节点,获得序列值然后也是对 1024 取模处理,基本与方案 1 相同。

    demo

    https://github.com/THH3/id-demo

    第 1 条附言  ·  2020-05-12 22:40:18 +08:00

    方案2优化了一下,使用PERSISTENT_SEQUENTIAL创建模式,比较ip:port是否已经存在,存在就使用原来的序号;

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2729 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:29 · PVG 08:29 · LAX 16:29 · JFK 19:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.