爱意满满的作品展示区。
Honwhy

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

  •  
  •   Honwhy ·
    honwhy · May 8, 2020 · 2587 views
    This topic created in 2223 days ago, the information mentioned may be changed or developed.

    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

    Supplement 1  ·  May 12, 2020

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

    No Comments Yet
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1104 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:01 · PVG 07:01 · LAX 16:01 · JFK 19:01
    ♥ Do have faith in what you're doing.