You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2022/07/07 06:45:35 UTC

[shardingsphere] branch master updated: Optimize worker-id into properties of key generate algorithm (#18916)

This is an automated email from the ASF dual-hosted git repository.

zhangliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new ba633c59cd2 Optimize worker-id into properties of key generate algorithm (#18916)
ba633c59cd2 is described below

commit ba633c59cd2b013a0e1f49be685f4bddb740aeb6
Author: gin <ja...@163.com>
AuthorDate: Thu Jul 7 14:45:28 2022 +0800

    Optimize worker-id into properties of key generate algorithm (#18916)
---
 .../keygen/SnowflakeKeyGenerateAlgorithm.java      | 37 ++++++++++++++--------
 .../keygen/fixture/WorkerIdGeneratorFixture.java   |  7 ++++
 .../keygen/CosIdSnowflakeKeyGenerateAlgorithm.java | 18 ++++++++++-
 .../keygen/fixture/WorkerIdGeneratorFixture.java   |  7 ++++
 .../infra/instance/InstanceContext.java            | 15 +++++++--
 .../infra/instance/workerid/WorkerIdGenerator.java | 36 ++++++++++++++++++++-
 .../instance/fixture/WorkerIdGeneratorFixture.java |  7 ++++
 .../builder/global/GlobalRulesBuilderTest.java     | 14 +++++---
 .../generator/ClusterWorkerIdGenerator.java        | 21 ++++++++++--
 .../generator/MemoryWorkerIdGenerator.java         |  9 +++++-
 .../generator/StandaloneWorkerIdGenerator.java     | 15 ++++++++-
 11 files changed, 161 insertions(+), 25 deletions(-)

diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithm.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithm.java
index 8c8ccfa79bd..f2ab00ef081 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithm.java
@@ -43,6 +43,8 @@ public final class SnowflakeKeyGenerateAlgorithm implements KeyGenerateAlgorithm
     
     public static final long EPOCH;
     
+    private static final String WORKER_ID_KEY = "worker-id";
+    
     private static final String MAX_VIBRATION_OFFSET_KEY = "max-vibration-offset";
     
     private static final String MAX_TOLERATE_TIME_DIFFERENCE_MILLISECONDS_KEY = "max-tolerate-time-difference-milliseconds";
@@ -71,6 +73,8 @@ public final class SnowflakeKeyGenerateAlgorithm implements KeyGenerateAlgorithm
     @Getter
     private Properties props;
     
+    private long workerId;
+    
     private int maxVibrationOffset;
     
     private int maxTolerateTimeDifferenceMilliseconds;
@@ -81,9 +85,6 @@ public final class SnowflakeKeyGenerateAlgorithm implements KeyGenerateAlgorithm
     
     private volatile long lastMilliseconds;
     
-    @Setter
-    private InstanceContext instanceContext;
-    
     static {
         Calendar calendar = Calendar.getInstance();
         calendar.set(2016, Calendar.NOVEMBER, 1);
@@ -101,6 +102,25 @@ public final class SnowflakeKeyGenerateAlgorithm implements KeyGenerateAlgorithm
         maxTolerateTimeDifferenceMilliseconds = getMaxTolerateTimeDifferenceMilliseconds(props);
     }
     
+    @Override
+    public void setInstanceContext(final InstanceContext instanceContext) {
+        workerId = initWorkerId(instanceContext);
+    }
+    
+    private long initWorkerId(final InstanceContext instanceContext) {
+        long result = null == instanceContext ? parseWorkerId() : instanceContext.generateWorkerId(props);
+        rangeValidate(result);
+        return result;
+    }
+    
+    private long parseWorkerId() {
+        return null == props ? DEFAULT_WORKER_ID : Long.parseLong(props.getOrDefault(WORKER_ID_KEY, DEFAULT_WORKER_ID).toString());
+    }
+    
+    private void rangeValidate(final long workerId) {
+        Preconditions.checkArgument(workerId >= 0L && workerId < WORKER_ID_MAX_VALUE, "Illegal worker id.");
+    }
+    
     private int getMaxVibrationOffset(final Properties props) {
         int result = Integer.parseInt(props.getOrDefault(MAX_VIBRATION_OFFSET_KEY, DEFAULT_VIBRATION_VALUE).toString());
         Preconditions.checkArgument(result >= 0 && result <= SEQUENCE_MASK, "Illegal max vibration offset.");
@@ -126,7 +146,7 @@ public final class SnowflakeKeyGenerateAlgorithm implements KeyGenerateAlgorithm
             sequence = sequenceOffset;
         }
         lastMilliseconds = currentMilliseconds;
-        return ((currentMilliseconds - EPOCH) << TIMESTAMP_LEFT_SHIFT_BITS) | (getWorkerId() << WORKER_ID_LEFT_SHIFT_BITS) | sequence;
+        return ((currentMilliseconds - EPOCH) << TIMESTAMP_LEFT_SHIFT_BITS) | (workerId << WORKER_ID_LEFT_SHIFT_BITS) | sequence;
     }
     
     @SneakyThrows(InterruptedException.class)
@@ -154,15 +174,6 @@ public final class SnowflakeKeyGenerateAlgorithm implements KeyGenerateAlgorithm
         sequenceOffset = sequenceOffset >= maxVibrationOffset ? 0 : sequenceOffset + 1;
     }
     
-    private long getWorkerId() {
-        if (null == instanceContext) {
-            return DEFAULT_WORKER_ID;
-        }
-        long result = instanceContext.getWorkerId();
-        Preconditions.checkArgument(result >= 0L && result < WORKER_ID_MAX_VALUE, "Illegal worker id.");
-        return result;
-    }
-    
     @Override
     public String getType() {
         return "SNOWFLAKE";
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/fixture/WorkerIdGeneratorFixture.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/fixture/WorkerIdGeneratorFixture.java
index 8612313eb37..f9d76e364fa 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/fixture/WorkerIdGeneratorFixture.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/fixture/WorkerIdGeneratorFixture.java
@@ -20,6 +20,8 @@ package org.apache.shardingsphere.sharding.algorithm.keygen.fixture;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator;
 
+import java.util.Properties;
+
 @RequiredArgsConstructor
 public final class WorkerIdGeneratorFixture implements WorkerIdGenerator {
     
@@ -29,4 +31,9 @@ public final class WorkerIdGeneratorFixture implements WorkerIdGenerator {
     public long generate() {
         return fixtureWorkerId;
     }
+    
+    @Override
+    public long generate(final Properties props) {
+        return fixtureWorkerId;
+    }
 }
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-plugin/shardingsphere-sharding-cosid/src/main/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/CosIdSnowflakeKeyGenerateAlgorithm.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-plugin/shardingsphere-sharding-cosid/src/main/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/CosIdSnowflakeKeyGenerateAlgorithm.java
index b2ce6e730ac..48764f7ff23 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-plugin/shardingsphere-sharding-cosid/src/main/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/CosIdSnowflakeKeyGenerateAlgorithm.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-plugin/shardingsphere-sharding-cosid/src/main/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/CosIdSnowflakeKeyGenerateAlgorithm.java
@@ -43,6 +43,12 @@ public final class CosIdSnowflakeKeyGenerateAlgorithm implements KeyGenerateAlgo
     
     public static final String EPOCH_KEY = "epoch";
     
+    public static final String WORKER_ID_KEY = "worker-id";
+    
+    public static final long DEFAULT_WORKER_ID = 0L;
+    
+    public static final long WORKER_ID_MAX_VALUE = 1L << 10;
+    
     @Getter
     private Properties props;
     
@@ -79,12 +85,22 @@ public final class CosIdSnowflakeKeyGenerateAlgorithm implements KeyGenerateAlgo
     
     @Override
     public void setInstanceContext(final InstanceContext instanceContext) {
-        long workerId = instanceContext.getWorkerId();
+        long workerId = initWorkerId(instanceContext);
         MillisecondSnowflakeId millisecondSnowflakeId =
                 new MillisecondSnowflakeId(epoch, MillisecondSnowflakeId.DEFAULT_TIMESTAMP_BIT, MillisecondSnowflakeId.DEFAULT_MACHINE_BIT, MillisecondSnowflakeId.DEFAULT_SEQUENCE_BIT, workerId);
         snowflakeId = new StringSnowflakeId(new ClockSyncSnowflakeId(millisecondSnowflakeId), Radix62IdConverter.PAD_START);
     }
     
+    private long initWorkerId(final InstanceContext instanceContext) {
+        long result = null == instanceContext ? Long.parseLong(props.getOrDefault(WORKER_ID_KEY, DEFAULT_WORKER_ID).toString()) : instanceContext.generateWorkerId(props);
+        rangeValidate(result);
+        return result;
+    }
+    
+    private void rangeValidate(final long workerId) {
+        Preconditions.checkArgument(workerId >= 0L && workerId < WORKER_ID_MAX_VALUE, "Illegal worker id.");
+    }
+    
     @Override
     public Comparable<?> generateKey() {
         if (asString) {
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-plugin/shardingsphere-sharding-cosid/src/test/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/fixture/WorkerIdGeneratorFixture.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-plugin/shardingsphere-sharding-cosid/src/test/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/fixture/WorkerIdGeneratorFixture.java
index ac4469c5f03..57010608c06 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-plugin/shardingsphere-sharding-cosid/src/test/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/fixture/WorkerIdGeneratorFixture.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-plugin/shardingsphere-sharding-cosid/src/test/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/fixture/WorkerIdGeneratorFixture.java
@@ -20,6 +20,8 @@ package org.apache.shardingsphere.sharding.cosid.algorithm.keygen.fixture;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator;
 
+import java.util.Properties;
+
 @RequiredArgsConstructor
 public final class WorkerIdGeneratorFixture implements WorkerIdGenerator {
     
@@ -29,4 +31,9 @@ public final class WorkerIdGeneratorFixture implements WorkerIdGenerator {
     public long generate() {
         return fixtureWorkerId;
     }
+    
+    @Override
+    public long generate(final Properties props) {
+        return fixtureWorkerId;
+    }
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
index ebef3b2a871..9f2eb4c4fad 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java
@@ -30,6 +30,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Properties;
 
 /**
  * Instance context.
@@ -52,7 +53,6 @@ public final class InstanceContext {
         this.workerIdGenerator = workerIdGenerator;
         this.modeConfiguration = modeConfiguration;
         this.lockContext = lockContext;
-        getWorkerId();
         lockContext.initLockState(this);
     }
     
@@ -105,15 +105,26 @@ public final class InstanceContext {
      * Get worker id.
      *
      * @return worker id
+     * @deprecated remove it when worker-id refactor was completed
      */
+    @Deprecated
     public long getWorkerId() {
         if (null == instance.getWorkerId()) {
-            // TODO process generate failed
             Optional.of(workerIdGenerator.generate()).ifPresent(instance::setWorkerId);
         }
         return instance.getWorkerId();
     }
     
+    /**
+     * Generate worker id.
+     *
+     * @param props props
+     * @return worker id
+     */
+    public long generateWorkerId(final Properties props) {
+        return workerIdGenerator.generate(props);
+    }
+    
     /**
      * Add compute node instance.
      * 
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/workerid/WorkerIdGenerator.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/workerid/WorkerIdGenerator.java
index 331a67d9e36..1b2d3b1c280 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/workerid/WorkerIdGenerator.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/instance/workerid/WorkerIdGenerator.java
@@ -17,15 +17,49 @@
 
 package org.apache.shardingsphere.infra.instance.workerid;
 
+import java.util.Optional;
+import java.util.Properties;
+
 /**
  * Worker id generator.
  */
 public interface WorkerIdGenerator {
     
+    String WORKER_ID_KEY = "worker-id";
+    
+    long DEFAULT_WORKER_ID = 0;
+    
     /**
      * Generate worker id.
-     * 
+     *
      * @return worker id
+     * @deprecated remove it when worker-id refactor was completed
      */
+    @Deprecated
     long generate();
+    
+    /**
+     * Generate worker id.
+     *
+     * @param props props
+     * @return worker id
+     */
+    long generate(Properties props);
+    
+    /**
+     * Parse worker id.
+     *
+     * @param props props
+     * @return worker id
+     */
+    default Optional<Long> parseWorkerId(final Properties props) {
+        if (null == props) {
+            return Optional.of(DEFAULT_WORKER_ID);
+        }
+        Object workerId = props.get(WORKER_ID_KEY);
+        if (null == workerId) {
+            return Optional.empty();
+        }
+        return Optional.of(Long.parseLong(workerId.toString()));
+    }
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/instance/fixture/WorkerIdGeneratorFixture.java b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/instance/fixture/WorkerIdGeneratorFixture.java
index 7f72b3d5d2c..ead4fa2527a 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/instance/fixture/WorkerIdGeneratorFixture.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/instance/fixture/WorkerIdGeneratorFixture.java
@@ -20,6 +20,8 @@ package org.apache.shardingsphere.infra.instance.fixture;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator;
 
+import java.util.Properties;
+
 @RequiredArgsConstructor
 public final class WorkerIdGeneratorFixture implements WorkerIdGenerator {
     
@@ -29,4 +31,9 @@ public final class WorkerIdGeneratorFixture implements WorkerIdGenerator {
     public long generate() {
         return fixtureWorkerId;
     }
+    
+    @Override
+    public long generate(final Properties props) {
+        return fixtureWorkerId;
+    }
 }
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
index 7aec9d7151b..05d23973e97 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData;
+import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator;
 import org.apache.shardingsphere.infra.lock.LockContext;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
@@ -38,6 +39,7 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public final class GlobalRulesBuilderTest {
     
@@ -58,13 +60,17 @@ public final class GlobalRulesBuilderTest {
     private InstanceContext buildInstanceContext() {
         ComputeNodeInstance computeNodeInstance = new ComputeNodeInstance(new JDBCInstanceMetaData(UUID.randomUUID().toString()));
         ModeConfiguration modeConfiguration = new ModeConfiguration("Standalone", null, false);
-        InstanceContext instanceContext = new InstanceContext(computeNodeInstance, () -> 0, modeConfiguration, mock(LockContext.class));
-        return instanceContext;
+        return new InstanceContext(computeNodeInstance, createWorkerIdGenerator(), modeConfiguration, mock(LockContext.class));
     }
     
     @SneakyThrows
     private ShardingSphereDatabase buildShardingSphereDatabase() {
-        ShardingSphereDatabase shardingSphereDatabase = ShardingSphereDatabase.create("logic_db", new MySQLDatabaseType());
-        return shardingSphereDatabase;
+        return ShardingSphereDatabase.create("logic_db", new MySQLDatabaseType());
+    }
+    
+    private WorkerIdGenerator createWorkerIdGenerator() {
+        WorkerIdGenerator result = mock(WorkerIdGenerator.class);
+        when(result.generate()).thenReturn(0L);
+        return result;
     }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/workerid/generator/ClusterWorkerIdGenerator.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/workerid/generator/ClusterWorkerIdGenerator.java
index ec032a0471f..ceeabe48a47 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/workerid/generator/ClusterWorkerIdGenerator.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/workerid/generator/ClusterWorkerIdGenerator.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.workerid.generator;
 
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData;
 import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator;
 import org.apache.shardingsphere.mode.manager.cluster.coordinator.RegistryCenter;
@@ -25,10 +26,12 @@ import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.worke
 import org.apache.shardingsphere.mode.repository.cluster.ClusterPersistRepository;
 
 import java.util.Optional;
+import java.util.Properties;
 
 /**
  * Worker id generator for cluster mode.
  */
+@Slf4j
 @RequiredArgsConstructor
 public final class ClusterWorkerIdGenerator implements WorkerIdGenerator {
     
@@ -43,9 +46,23 @@ public final class ClusterWorkerIdGenerator implements WorkerIdGenerator {
         return registryCenter.getComputeNodeStatusService().loadInstanceWorkerId(instanceMetaData.getId()).orElseGet(this::reGenerate);
     }
     
-    private Long reGenerate() {
-        Long result = Long.valueOf(Optional.ofNullable(repository.getSequentialId(WorkerIdNode.getWorkerIdGeneratorPath(instanceMetaData.getId()), "")).orElse("0"));
+    @Override
+    public long generate(final Properties props) {
+        long result = generate();
+        checkConfigured(result, props);
+        return result;
+    }
+    
+    private long reGenerate() {
+        long result = Long.parseLong(Optional.ofNullable(repository.getSequentialId(WorkerIdNode.getWorkerIdGeneratorPath(instanceMetaData.getId()), "")).orElse("0"));
         registryCenter.getComputeNodeStatusService().persistInstanceWorkerId(instanceMetaData.getId(), result);
         return result;
     }
+    
+    private void checkConfigured(final long generatedWorkerId, final Properties props) {
+        Optional<Long> configuredWorkerId = parseWorkerId(props);
+        if (configuredWorkerId.isPresent()) {
+            log.warn("No need to configured {} in cluster mode, system assigned work-id was {}", WORKER_ID_KEY, generatedWorkerId);
+        }
+    }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/workerid/generator/MemoryWorkerIdGenerator.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/workerid/generator/MemoryWorkerIdGenerator.java
index 7a639b1d2d1..18d5417c382 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/workerid/generator/MemoryWorkerIdGenerator.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-memory-mode/shardingsphere-memory-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/memory/workerid/generator/MemoryWorkerIdGenerator.java
@@ -19,6 +19,8 @@ package org.apache.shardingsphere.mode.manager.memory.workerid.generator;
 
 import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator;
 
+import java.util.Properties;
+
 /**
  * Worker id generator for memory mode.
  */
@@ -27,6 +29,11 @@ public final class MemoryWorkerIdGenerator implements WorkerIdGenerator {
     @Override
     public long generate() {
         // TODO need to support custom configuration of worker-id
-        return 0;
+        return DEFAULT_WORKER_ID;
+    }
+    
+    @Override
+    public long generate(final Properties props) {
+        return parseWorkerId(props).orElse(DEFAULT_WORKER_ID);
     }
 }
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/workerid/generator/StandaloneWorkerIdGenerator.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/workerid/generator/StandaloneWorkerIdGenerator.java
index 3ec268e83c6..481a63d5b8f 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/workerid/generator/StandaloneWorkerIdGenerator.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-standalone-mode/shardingsphere-standalone-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/workerid/generator/StandaloneWorkerIdGenerator.java
@@ -17,8 +17,12 @@
 
 package org.apache.shardingsphere.mode.manager.standalone.workerid.generator;
 
+import org.apache.shardingsphere.infra.exception.ShardingSphereException;
 import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator;
 
+import java.util.Optional;
+import java.util.Properties;
+
 /**
  * Worker id generator for standalone mode.
  */
@@ -27,6 +31,15 @@ public final class StandaloneWorkerIdGenerator implements WorkerIdGenerator {
     @Override
     public long generate() {
         // TODO need to support custom configuration of worker-id
-        return 0;
+        return DEFAULT_WORKER_ID;
+    }
+    
+    @Override
+    public long generate(final Properties props) {
+        Optional<Long> result = parseWorkerId(props);
+        if (result.isPresent()) {
+            return result.get();
+        }
+        throw new ShardingSphereException("{} is required configuration item in standalone mode", WORKER_ID_KEY);
     }
 }