springboot~多节点应用里的雪花算法唯一性

雪花算法的唯一性,在单个节点中是可以保证的,对应kubernetes中的应用,如果是横向扩展后,进行多副本的情况下,可能出现重复的ID,这需要我们按着pod_name进行一个workId的生成,我还是建议通过不引入第三方组件和网络请求的前提下解决这个问题,所以我修改了kubernetes的yaml文件。

  • k8s的yaml配置

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: my-app
    spec:
    replicas: 3
    selector:
    matchLabels:
    app: my-app
    template:
    metadata:
    labels:
    app: my-app
    spec:
    containers:
    - name: my-container
    image: my-image:latest
    env:
    - name: POD_NAME
    valueFrom:
    fieldRef:
    fieldPath: metadata.name # 获取当前 Pod 的名称

  • 字符串(0~1024)数字方法,通过掩码的方式

    ```
    public static int stringToNumber(String input) {
    // 使用CRC32计算字符串的哈希值
    CRC32 crc = new CRC32();
    byte[] bytes = input.getBytes(StandardCharsets.UTF_8);
    crc.update(bytes);

        // 获取哈希值并限制在0到1023之间
        long hashValue = crc.getValue();
        return (int) (hashValue % 1024);
    }
    

    ```

  • 获取服务器机器码

    ```
    /*
    * 获取机器码.
    * @return
    /
    public static String getUniqueMachineId() {
    StringBuilder uniqueId = new StringBuilder();

        try {
            // 获取本机的IP地址
            InetAddress localHost = InetAddress.getLocalHost();
            uniqueId.append(localHost.getHostAddress()).append("_");
    
            // 获取网络接口并获取MAC地址
            Enumeration networkInterfaces = NetworkInterface.getNetworkInterfaces();
            while (networkInterfaces.hasMoreElements()) {
                NetworkInterface networkInterface = networkInterfaces.nextElement();
                byte[] mac = networkInterface.getHardwareAddress();
                if (mac != null) {
                    for (int i = 0; i < mac.length; i++) {
                        uniqueId.append(String.format("%02X", mac[i]));
                        if (i < mac.length - 1) {
                            uniqueId.append("-");
                        }
                    }
                    uniqueId.append("_");
                }
            }
    
            // 添加系统信息作为补充
            String osName = System.getProperty("os.name");
            String osVersion = System.getProperty("os.version");
            String userName = System.getProperty("user.name");
            uniqueId.append(osName).append("_").append(osVersion).append("_").append(userName);
    
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    
        return uniqueId.toString();
    }
    

    ```

  • ID生成器的改进

    ```
    @Slf4j
    public class IdUtils {

    static SnowFlakeGenerator snowFlakeGenerator;
    
    public static String generateId() {
        if (snowFlakeGenerator == null) {
            long podNameCode = stringToNumber(Optional.ofNullable(System.getenv("POD_NAME")).orElse(stringToNumber(getUniqueMachineId())));
            log.debug("podNameCode:{}", podNameCode);
            snowFlakeGenerator = new SnowFlakeGenerator(podNameCode);
    
        }
        return snowFlakeGenerator.hexNextId();
    }
    

    ```

文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/5012.html

(0)
LomuLomu
上一篇 2024 年 12 月 31 日 上午4:16
下一篇 2024 年 12 月 31 日

相关推荐

  • 【蓝桥杯】第十六届Java B组竞赛解题实录

    题目A:高塔脱险 基础难度题目,主要考察基本编程能力,但需特别注意数值范围问题,使用int类型可能导致数据溢出正确答案:202 package competition.t1; import java.io.*; public class Solution { static class FastIO { static InputStreamReader rea…

    2025 年 5 月 13 日
    32600
  • WxPython跨平台开发框架之使用PyInstaller 进行打包处理

    使用PyInstaller 打包Python项目是一个常见的需求,它可以将Python程序及其所有依赖项打包成一个独立的可执行文件或者安装文件,方便在没有安装Python环境的机器上运行。本随笔介绍WxPython跨平台开发框架中使用PyInstaller 进行打包处理,包括在WIndow平台下生成独立的exe文件,松散结构的exe文件和目录,以及在MacO…

    2025 年 1 月 11 日
    65500
  • 深入理解 Java 接口的回调机制

    前言 回调是一种非常重要的编程技术,它广泛应用于事件驱动的编程、异步任务和框架设计中。在 Java 中,回调机制通常通过 接口 来实现。本篇博客将详细解析 Java 接口的回调原理、实现方式,以及实际开发中的应用场景。 泪崩了,期末JAVA编程考了回调,小编不会。 一、什么是回调? 回调(Callback) 是指通过将一个方法作为参数传递给另一个方法,在某些…

    2025 年 1 月 19 日
    53500
  • 电商项目-网站首页高可用(一)

    “`markdown 一、Nginx概览 Nginx,一个以高性能著称的HTTP服务器,是处理高并发请求的理想选择。在单台Tomcat服务器中,理论上最多只能处理500个并发连接,这对于流量密集的首页而言远远不够,容易导致服务崩溃。对于Tomcat集群而言,虽然可以扩展至5台服务器,但超过这个数量,性能反而会下降。 因此,在服务器选型时,Nginx是一个不…

    未分类 2024 年 12 月 24 日
    51900
  • 系统突遇百倍流量冲击?资深架构师的应对策略全解析

    “当你负责的核心系统某天突然面临百倍流量冲击,该如何紧急应对?”——这并非虚构场景,而是某科技公司面试中的真实考题。当候选人回答“简单扩容”时,面试官立即追问:“若资源不足或数据库崩溃呢?”瞬间暴露出技术方案的局限性。这类问题如同技术照妖镜,能精准检验工程师的系统性思维。仅靠“增加服务器”这类条件反射式的回答,往往暴露架构认知的短板。完整的解决方案需融合流量…

    2025 年 5 月 13 日
    36200

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信