diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md index 647d84ae668..c97cc6c29f9 100644 --- a/changes/en-us/2.x.md +++ b/changes/en-us/2.x.md @@ -51,6 +51,7 @@ Add changes here for all PR submitted to the 2.x branch. - [[#6743](https://github.com/apache/incubator-seata/pull/6743)] upgrade npmjs version in saga - [[#6746](https://github.com/apache/incubator-seata/pull/6746)] optimize compatible dependencies - [[#6745](https://github.com/apache/incubator-seata/pull/6745)] fix node-gyp build error on arm64 and macos +- [[#6748](https://github.com/apache/incubator-seata/pull/6748)] optimize ConsistentHashLoadBalance Algorithm - [[#6747](https://github.com/apache/incubator-seata/pull/6747)] optimize fastjson deserialization diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md index c8531deb4f5..44aab0dccc6 100644 --- a/changes/zh-cn/2.x.md +++ b/changes/zh-cn/2.x.md @@ -52,6 +52,7 @@ - [[#6743](https://github.com/apache/incubator-seata/pull/6743)] 升级saga模块npmjs版本 - [[#6746](https://github.com/apache/incubator-seata/pull/6746)] 优化 compatible 模块依赖 - [[#6745](https://github.com/apache/incubator-seata/pull/6745)] 修复 node-gyp 在 arm64 和 macos 构建失败问题 +- [[#6748](https://github.com/apache/incubator-seata/pull/6748)] 优化 ConsistentHashLoadBalance 算法 - [[#6747](https://github.com/apache/incubator-seata/pull/6747)] 优化 fastjson 反序列化 diff --git a/discovery/seata-discovery-core/src/main/java/org/apache/seata/discovery/loadbalance/ConsistentHashLoadBalance.java b/discovery/seata-discovery-core/src/main/java/org/apache/seata/discovery/loadbalance/ConsistentHashLoadBalance.java index 75fda1ad3cc..1156bf00319 100644 --- a/discovery/seata-discovery-core/src/main/java/org/apache/seata/discovery/loadbalance/ConsistentHashLoadBalance.java +++ b/discovery/seata-discovery-core/src/main/java/org/apache/seata/discovery/loadbalance/ConsistentHashLoadBalance.java @@ -16,6 +16,7 @@ */ package org.apache.seata.discovery.loadbalance; +import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.List; @@ -29,7 +30,6 @@ /** * The type consistent hash load balance. - * */ @LoadLevel(name = LoadBalanceFactory.CONSISTENT_HASH_LOAD_BALANCE) public class ConsistentHashLoadBalance implements LoadBalance { @@ -37,11 +37,13 @@ public class ConsistentHashLoadBalance implements LoadBalance { /** * The constant LOAD_BALANCE_CONSISTENT_HASH_VIRTUAL_NODES. */ - public static final String LOAD_BALANCE_CONSISTENT_HASH_VIRTUAL_NODES = LoadBalanceFactory.LOAD_BALANCE_PREFIX + "virtualNodes"; + public static final String LOAD_BALANCE_CONSISTENT_HASH_VIRTUAL_NODES = LoadBalanceFactory.LOAD_BALANCE_PREFIX + + "virtualNodes"; /** * The constant VIRTUAL_NODES_NUM. */ - private static final int VIRTUAL_NODES_NUM = ConfigurationFactory.getInstance().getInt(LOAD_BALANCE_CONSISTENT_HASH_VIRTUAL_NODES, VIRTUAL_NODES_DEFAULT); + private static final int VIRTUAL_NODES_NUM = ConfigurationFactory.getInstance().getInt( + LOAD_BALANCE_CONSISTENT_HASH_VIRTUAL_NODES, VIRTUAL_NODES_DEFAULT); @Override public T select(List invokers, String xid) { @@ -51,7 +53,7 @@ public T select(List invokers, String xid) { private static final class ConsistentHashSelector { private final SortedMap virtualInvokers = new TreeMap<>(); - private final HashFunction hashFunction = new MD5Hash(); + private final HashFunction hashFunction = new SHA256Hash(); ConsistentHashSelector(List invokers, int virtualNodes) { for (T invoker : invokers) { @@ -68,12 +70,12 @@ public T select(String objectKey) { } } - @SuppressWarnings("lgtm[java/weak-cryptographic-algorithm]") - private static class MD5Hash implements HashFunction { + private static class SHA256Hash implements HashFunction { MessageDigest instance; - public MD5Hash() { + + public SHA256Hash() { try { - instance = MessageDigest.getInstance("MD5"); + instance = MessageDigest.getInstance("SHA-256"); } catch (NoSuchAlgorithmException e) { throw new IllegalStateException(e.getMessage(), e); } @@ -83,13 +85,13 @@ public MD5Hash() { public long hash(String key) { instance.reset(); instance.update(key.getBytes()); - byte[] digest = instance.digest(); - long h = 0; - for (int i = 0; i < 4; i++) { - h <<= 8; - h |= ((int) digest[i]) & 0xFF; + byte[] digest = instance.digest(key.getBytes(StandardCharsets.UTF_8)); + long hash = 0; + for (int i = 0; i < 8 && i < digest.length; i++) { + hash <<= 8; + hash |= digest[i] & 0xff; } - return h; + return hash; } }