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

打印 上一主题 下一主题

主题 891|帖子 891|积分 2673

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

  • k8s的yaml设置
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4.   name: my-app
  5. spec:
  6.   replicas: 3
  7.   selector:
  8.     matchLabels:
  9.       app: my-app
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: my-app
  14.     spec:
  15.       containers:
  16.       - name: my-container
  17.         image: my-image:latest
  18.         env:
  19.         - name: POD_NAME
  20.           valueFrom:
  21.             fieldRef:
  22.               fieldPath: metadata.name  # 获取当前 Pod 的名称
复制代码

  • 字符串(0~1024)数字方法,通过掩码的方式
  1. public static int stringToNumber(String input) {
  2.         // 使用CRC32计算字符串的哈希值
  3.         CRC32 crc = new CRC32();
  4.         byte[] bytes = input.getBytes(StandardCharsets.UTF_8);
  5.         crc.update(bytes);
  6.         
  7.         // 获取哈希值并限制在0到1023之间
  8.         long hashValue = crc.getValue();
  9.         return (int) (hashValue % 1024);
  10.     }
复制代码

  • 获取服务器机器码
  1. /**
  2.          * 获取机器码.
  3.          * @return
  4.          */
  5.         public static String getUniqueMachineId() {
  6.                 StringBuilder uniqueId = new StringBuilder();
  7.                 try {
  8.                         // 获取本机的IP地址
  9.                         InetAddress localHost = InetAddress.getLocalHost();
  10.                         uniqueId.append(localHost.getHostAddress()).append("_");
  11.                         // 获取网络接口并获取MAC地址
  12.                         Enumeration<NetworkInterface> networkInterfaces = NetworkInterface.getNetworkInterfaces();
  13.                         while (networkInterfaces.hasMoreElements()) {
  14.                                 NetworkInterface networkInterface = networkInterfaces.nextElement();
  15.                                 byte[] mac = networkInterface.getHardwareAddress();
  16.                                 if (mac != null) {
  17.                                         for (int i = 0; i < mac.length; i++) {
  18.                                                 uniqueId.append(String.format("%02X", mac[i]));
  19.                                                 if (i < mac.length - 1) {
  20.                                                         uniqueId.append("-");
  21.                                                 }
  22.                                         }
  23.                                         uniqueId.append("_");
  24.                                 }
  25.                         }
  26.                         // 添加系统信息作为补充
  27.                         String osName = System.getProperty("os.name");
  28.                         String osVersion = System.getProperty("os.version");
  29.                         String userName = System.getProperty("user.name");
  30.                         uniqueId.append(osName).append("_").append(osVersion).append("_").append(userName);
  31.                 }
  32.                 catch (Exception e) {
  33.                         e.printStackTrace();
  34.                 }
  35.                 return uniqueId.toString();
  36.         }
复制代码

  • ID生成器的改进
  1. @Slf4j
  2. public class IdUtils {
  3.         static SnowFlakeGenerator snowFlakeGenerator;
  4.         public static String generateId() {
  5.                 if (snowFlakeGenerator == null) {
  6.                         long podNameCode = stringToNumber(Optional.ofNullable(System.getenv("POD_NAME")).orElse(stringToNumber(getUniqueMachineId())));
  7.                         log.debug("podNameCode:{}", podNameCode);
  8.                         snowFlakeGenerator = new SnowFlakeGenerator(podNameCode);
  9.                 }
  10.                 return snowFlakeGenerator.hexNextId();
  11.         }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表