Browse Source

[Feature][JsonSplit] snowFlakeUtils (#4432)

* snowFlakeUtils

* snowFlakeUtils

* snowFlakeUtils

* fix instance

* 'codestyle'

* 'codestyle'

* 'codestyle'

* 'codestyle'

* 'codestyle'

Co-authored-by: 文蛤 <wenge@myweimai.com>
JinyLeeChina 4 years ago
parent
commit
74712a4448

+ 5 - 0
dolphinscheduler-api/pom.xml

@@ -39,6 +39,11 @@
             <artifactId>dolphinscheduler-dao</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.dolphinscheduler</groupId>
+            <artifactId>dolphinscheduler-common</artifactId>
+        </dependency>
+
         <!--springboot-->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 5 - 0
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/Constants.java

@@ -1029,4 +1029,9 @@ public final class Constants {
      * pstree, get pud and sub pid
      */
     public static final String PSTREE = "pstree";
+
+    /**
+     * snow flake, data center id, this id must be greater than 0 and less than 32
+     */
+    public static final String SNOW_FLAKE_DATA_CENTER_ID = "data.center.id";
 }

+ 103 - 0
dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/utils/SnowFlakeUtils.java

@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.common.utils;
+
+import org.apache.dolphinscheduler.common.Constants;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Objects;
+
+public class SnowFlakeUtils {
+    // start timestamp
+    private static final long START_TIMESTAMP = 1609430400000L; //2021-01-01
+    // Number of digits
+    private static final long SEQUENCE_BIT = 12;
+    private static final long MACHINE_BIT = 5;
+    private static final long DATA_CENTER_BIT = 5;
+    // Maximum value
+    private static final long MAX_DATA_CENTER_NUM = ~(-1L << DATA_CENTER_BIT);
+    private static final long MAX_SEQUENCE = ~(-1L << SEQUENCE_BIT);
+    // The displacement to the left
+    private static final long MACHINE_LEFT = SEQUENCE_BIT;
+    private static final long DATA_CENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
+    private static final long TIMESTAMP_LEFT = DATA_CENTER_LEFT + DATA_CENTER_BIT;
+    private final int dataCenterId;
+    private final int machineId;
+    private long sequence = 0L;
+    private long lastTimestamp = -1L;
+
+    private SnowFlakeUtils() throws SnowFlakeException {
+        this.dataCenterId = PropertyUtils.getInt(Constants.SNOW_FLAKE_DATA_CENTER_ID, 1);
+        if (dataCenterId > MAX_DATA_CENTER_NUM || dataCenterId < 0) {
+            throw new IllegalArgumentException(String.format("dataCenterId can't be greater than %d or less than 0", MAX_DATA_CENTER_NUM));
+        }
+        try {
+            this.machineId = Math.abs(Objects.hash(InetAddress.getLocalHost().getHostName())) % 32;
+        } catch (UnknownHostException e) {
+            throw new SnowFlakeException(e.getMessage());
+        }
+    }
+
+    private static SnowFlakeUtils instance = null;
+
+    public static synchronized SnowFlakeUtils getInstance() throws SnowFlakeException {
+        if (instance == null) {
+            instance = new SnowFlakeUtils();
+        }
+        return instance;
+    }
+
+    public synchronized long nextId() throws SnowFlakeException {
+        long currStmp = nowTimestamp();
+        if (currStmp < lastTimestamp) {
+            throw new SnowFlakeException("Clock moved backwards. Refusing to generate id");
+        }
+        if (currStmp == lastTimestamp) {
+            sequence = (sequence + 1) & MAX_SEQUENCE;
+            if (sequence == 0L) {
+                currStmp = getNextMill();
+            }
+        } else {
+            sequence = 0L;
+        }
+        lastTimestamp = currStmp;
+        return (currStmp - START_TIMESTAMP) << TIMESTAMP_LEFT
+                | dataCenterId << DATA_CENTER_LEFT
+                | machineId << MACHINE_LEFT
+                | sequence;
+    }
+
+    private long getNextMill() {
+        long mill = nowTimestamp();
+        while (mill <= lastTimestamp) {
+            mill = nowTimestamp();
+        }
+        return mill;
+    }
+
+    private long nowTimestamp() {
+        return System.currentTimeMillis();
+    }
+
+    public static class SnowFlakeException extends Exception {
+        public SnowFlakeException(String message) {
+            super(message);
+        }
+    }
+}

+ 2 - 0
dolphinscheduler-common/src/main/resources/common.properties

@@ -75,3 +75,5 @@ datasource.encryption.salt=!@#$%^&*
 
 # Network IP gets priority, default inner outer
 #dolphin.scheduler.network.priority.strategy=default
+# 0<dataCenterId<32
+#data.center.id=1

+ 33 - 0
dolphinscheduler-common/src/test/java/org/apache/dolphinscheduler/common/utils/SnowFlakeUtilsTest.java

@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.dolphinscheduler.common.utils;
+
+import org.junit.Test;
+
+public class SnowFlakeUtilsTest {
+    @Test
+    public void testNextId() {
+        try {
+            for (int i = 0; i < 5; i++) {
+                System.out.println(SnowFlakeUtils.getInstance().nextId());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}