From ef5de74d7c6c0559e75d71fc51526e9cecff5739 Mon Sep 17 00:00:00 2001 From: qiaomr <1393092021@qq.com> Date: Fri, 5 Jan 2024 18:11:00 +0800 Subject: [PATCH 1/3] 3.2.0.a --- boot/pom.xml | 4 ++-- event/pom.xml | 4 ++-- hotswap/pom.xml | 4 ++-- monitor/pom.xml | 4 ++-- net/pom.xml | 4 ++-- orm/pom.xml | 4 ++-- pom.xml | 4 ++-- protocol/pom.xml | 4 ++-- scheduler/pom.xml | 4 ++-- storage/pom.xml | 4 ++-- 10 files changed, 20 insertions(+), 20 deletions(-) diff --git a/boot/pom.xml b/boot/pom.xml index 86d3ed15..da51c55c 100644 --- a/boot/pom.xml +++ b/boot/pom.xml @@ -7,10 +7,10 @@ com.zfoo boot jar - 3.2.0 + 3.2.0.a - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 diff --git a/event/pom.xml b/event/pom.xml index f1bed0ef..d89bb2b8 100644 --- a/event/pom.xml +++ b/event/pom.xml @@ -7,10 +7,10 @@ com.zfoo event jar - 3.2.0 + 3.2.0.a - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 diff --git a/hotswap/pom.xml b/hotswap/pom.xml index 2d4b70f4..7ad3c870 100644 --- a/hotswap/pom.xml +++ b/hotswap/pom.xml @@ -7,10 +7,10 @@ com.zfoo hotswap jar - 3.2.0 + 3.2.0.a - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 diff --git a/monitor/pom.xml b/monitor/pom.xml index 63efce6d..a431c6a4 100644 --- a/monitor/pom.xml +++ b/monitor/pom.xml @@ -7,10 +7,10 @@ com.zfoo monitor jar - 3.2.0 + 3.2.0.a - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 diff --git a/net/pom.xml b/net/pom.xml index 1ceb8744..766a5b02 100644 --- a/net/pom.xml +++ b/net/pom.xml @@ -7,10 +7,10 @@ com.zfoo net jar - 3.2.0 + 3.2.0.a - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 diff --git a/orm/pom.xml b/orm/pom.xml index 1eb25662..f6dec2cd 100644 --- a/orm/pom.xml +++ b/orm/pom.xml @@ -7,10 +7,10 @@ com.zfoo orm jar - 3.2.0 + 3.2.0.a - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 diff --git a/pom.xml b/pom.xml index eeb34488..499bcd47 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.zfoo zfoo pom - 3.2.0 + 3.2.0.a zfoo @@ -126,7 +126,7 @@ - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 diff --git a/protocol/pom.xml b/protocol/pom.xml index 81f583fb..93067edd 100644 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -7,10 +7,10 @@ com.zfoo protocol jar - 3.2.0 + 3.2.0.a - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 diff --git a/scheduler/pom.xml b/scheduler/pom.xml index e0e03eec..106fb7f8 100644 --- a/scheduler/pom.xml +++ b/scheduler/pom.xml @@ -7,10 +7,10 @@ com.zfoo scheduler jar - 3.2.0 + 3.2.0.a - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 diff --git a/storage/pom.xml b/storage/pom.xml index 5a097172..bad3b8b2 100644 --- a/storage/pom.xml +++ b/storage/pom.xml @@ -7,10 +7,10 @@ com.zfoo storage jar - 3.2.0 + 3.2.0.a - 3.2.0 + 3.2.0.a 6.0.11 3.1.3 From 1b0613770545a0cf6879a119248dd2d9413d9940 Mon Sep 17 00:00:00 2001 From: qiaomr <1393092021@qq.com> Date: Sat, 6 Jan 2024 11:40:38 +0800 Subject: [PATCH 2/3] =?UTF-8?q?memory=20=E8=B4=9F=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbstractConsumerLoadBalancer.java | 3 ++ .../ConsistentHashConsumerLoadBalancer.java | 45 +++++++++-------- ...stentHashOfMemoryConsumerLoadBalancer.java | 49 +++++++++++++++++++ .../zfoo/net/handler/GatewayRouteHandler.java | 7 ++- 4 files changed, 83 insertions(+), 21 deletions(-) create mode 100644 net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashOfMemoryConsumerLoadBalancer.java diff --git a/net/src/main/java/com/zfoo/net/consumer/balancer/AbstractConsumerLoadBalancer.java b/net/src/main/java/com/zfoo/net/consumer/balancer/AbstractConsumerLoadBalancer.java index e30fef16..d1e91232 100644 --- a/net/src/main/java/com/zfoo/net/consumer/balancer/AbstractConsumerLoadBalancer.java +++ b/net/src/main/java/com/zfoo/net/consumer/balancer/AbstractConsumerLoadBalancer.java @@ -39,6 +39,9 @@ public abstract class AbstractConsumerLoadBalancer implements IConsumerLoadBalan case "consistent-hash": balancer = ConsistentHashConsumerLoadBalancer.getInstance(); break; + case "consistent-hash-of-memory": + balancer = ConsistentHashOfMemoryConsumerLoadBalancer.getInstance(); + break; default: throw new RuntimeException(StringUtils.format("Load balancer is not recognized[{}]", loadBalancer)); } diff --git a/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashConsumerLoadBalancer.java b/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashConsumerLoadBalancer.java index dfc8b1f0..65ee46db 100644 --- a/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashConsumerLoadBalancer.java +++ b/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashConsumerLoadBalancer.java @@ -17,6 +17,7 @@ import com.zfoo.net.NetContext; import com.zfoo.net.session.Session; import com.zfoo.net.util.ConsistentHash; import com.zfoo.net.util.FastTreeMapIntLong; +import com.zfoo.net.util.HashUtils; import com.zfoo.protocol.ProtocolManager; import com.zfoo.protocol.collection.CollectionUtils; import com.zfoo.protocol.exception.RunException; @@ -42,7 +43,7 @@ public class ConsistentHashConsumerLoadBalancer extends AbstractConsumerLoadBala private static final AtomicReferenceArray consistentHashMap = new AtomicReferenceArray<>(ProtocolManager.MAX_MODULE_NUM); private static final int VIRTUAL_NODE_NUMS = 200; - private ConsistentHashConsumerLoadBalancer() { + public ConsistentHashConsumerLoadBalancer() { } public static ConsistentHashConsumerLoadBalancer getInstance() { @@ -62,6 +63,29 @@ public class ConsistentHashConsumerLoadBalancer extends AbstractConsumerLoadBala return RandomConsumerLoadBalancer.getInstance().loadBalancer(packet, argument); } + updateConsistentHashMap(); + + var module = ProtocolManager.moduleByProtocol(packet.getClass()); + var fastTreeMap = consistentHashMap.get(module.getId()); + if (fastTreeMap == null) { + fastTreeMap = updateModuleToConsistentHash(module); + } + if (fastTreeMap == null) { + throw new RunException("ConsistentHashLoadBalancer [protocol:{}][argument:{}], no service provides the [module:{}]", packet.getClass(), argument, module); + } + var nearestIndex = fastTreeMap.indexOfNearestCeilingKey(HashUtils.fnvHash(argument)); + if (nearestIndex < 0) { + throw new RunException("no service provides the [module:{}]", module); + } + var sid = fastTreeMap.getByIndex(nearestIndex); + var session = NetContext.getSessionManager().getClientSession(sid); + if (session == null) { + throw new RunException("unknown no service provides the [module:{}]", module); + } + return session; + } + + private void updateConsistentHashMap() { // 如果更新时间不匹配,则更新到最新的服务提供者 var currentClientSessionChangeId = NetContext.getSessionManager().getClientSessionChangeId(); if (currentClientSessionChangeId != lastClientSessionChangeId) { @@ -75,25 +99,6 @@ public class ConsistentHashConsumerLoadBalancer extends AbstractConsumerLoadBala } lastClientSessionChangeId = currentClientSessionChangeId; } - - var module = ProtocolManager.moduleByProtocol(packet.getClass()); - var fastTreeMap = consistentHashMap.get(module.getId()); - if (fastTreeMap == null) { - fastTreeMap = updateModuleToConsistentHash(module); - } - if (fastTreeMap == null) { - throw new RunException("ConsistentHashLoadBalancer [protocol:{}][argument:{}], no service provides the [module:{}]", packet.getClass(), argument, module); - } - var nearestIndex = fastTreeMap.indexOfNearestCeilingKey(argument.hashCode()); - if (nearestIndex < 0) { - throw new RunException("no service provides the [module:{}]", module); - } - var sid = fastTreeMap.getByIndex(nearestIndex); - var session = NetContext.getSessionManager().getClientSession(sid); - if (session == null) { - throw new RunException("unknown no service provides the [module:{}]", module); - } - return session; } diff --git a/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashOfMemoryConsumerLoadBalancer.java b/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashOfMemoryConsumerLoadBalancer.java new file mode 100644 index 00000000..1167336c --- /dev/null +++ b/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashOfMemoryConsumerLoadBalancer.java @@ -0,0 +1,49 @@ +package com.zfoo.net.consumer.balancer; + +import com.zfoo.net.NetContext; +import com.zfoo.net.session.Session; +import org.apache.curator.shaded.com.google.common.util.concurrent.AtomicLongMap; + +/** + * 记忆化一致性hash + * + * @author qmr + * @date 2024/1/6 + */ +public class ConsistentHashOfMemoryConsumerLoadBalancer extends ConsistentHashConsumerLoadBalancer { + + public static final ConsistentHashOfMemoryConsumerLoadBalancer INSTANCE = new ConsistentHashOfMemoryConsumerLoadBalancer(); + + /** + * 存储已经负载后的sid + */ + private static final AtomicLongMap uid2sidMap = AtomicLongMap.create(); + + private ConsistentHashOfMemoryConsumerLoadBalancer() { + } + + public static ConsistentHashOfMemoryConsumerLoadBalancer getInstance() { + return INSTANCE; + } + + @Override + public Session loadBalancer(Object packet, Object argument) { + + if (argument instanceof Long) { + long sid = uid2sidMap.get((Long) argument); + if (sid > 0L) { + Session memorySession = NetContext.getSessionManager().getClientSession(sid); + if (null != memorySession){ + return memorySession; + }else { + uid2sidMap.remove((Long) argument); + } + } + } + Session loadBalancer = super.loadBalancer(packet, argument); + if (argument instanceof Long){ + uid2sidMap.put((Long) argument, loadBalancer.getSid()); + } + return loadBalancer; + } +} diff --git a/net/src/main/java/com/zfoo/net/handler/GatewayRouteHandler.java b/net/src/main/java/com/zfoo/net/handler/GatewayRouteHandler.java index 7dc1055d..2bb1ee4a 100644 --- a/net/src/main/java/com/zfoo/net/handler/GatewayRouteHandler.java +++ b/net/src/main/java/com/zfoo/net/handler/GatewayRouteHandler.java @@ -16,6 +16,7 @@ package com.zfoo.net.handler; import com.zfoo.event.manager.EventBus; import com.zfoo.net.NetContext; import com.zfoo.net.consumer.balancer.ConsistentHashConsumerLoadBalancer; +import com.zfoo.net.consumer.balancer.IConsumerLoadBalancer; import com.zfoo.net.core.gateway.IGatewayLoadBalancer; import com.zfoo.net.core.gateway.model.GatewaySessionInactiveEvent; import com.zfoo.net.packet.DecodedPacketInfo; @@ -26,6 +27,7 @@ import com.zfoo.net.router.attachment.GatewayAttachment; import com.zfoo.net.router.attachment.SignalAttachment; import com.zfoo.net.session.Session; import com.zfoo.net.util.SessionUtils; +import com.zfoo.protocol.ProtocolManager; import com.zfoo.protocol.util.JsonUtils; import com.zfoo.protocol.util.StringUtils; import com.zfoo.scheduler.util.TimeUtils; @@ -114,7 +116,10 @@ public class GatewayRouteHandler extends ServerRouteHandler { */ private void forwardingPacket(Object packet, Object attachment, Object argument) { try { - var consumerSession = ConsistentHashConsumerLoadBalancer.getInstance().loadBalancer(packet, argument); + // 网关统一用 moduleid uid 获取 session + var loadBalancer = NetContext.getConsumer().loadBalancer(ProtocolManager.moduleByProtocol(packet.getClass())); + Session consumerSession = loadBalancer.loadBalancer(packet, argument); +// var consumerSession = ConsistentHashConsumerLoadBalancer.getInstance().loadBalancer(packet, argument); NetContext.getRouter().send(consumerSession, packet, attachment); } catch (Exception e) { logger.error("An exception occurred at the gateway", e); From c590ccf87aa96c1f7dd17f803884739dc80c3736 Mon Sep 17 00:00:00 2001 From: qiaomr <1393092021@qq.com> Date: Sat, 6 Jan 2024 14:29:46 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=8E=B7=E5=8F=96=20memory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConsistentHashOfMemoryConsumerLoadBalancer.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashOfMemoryConsumerLoadBalancer.java b/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashOfMemoryConsumerLoadBalancer.java index 1167336c..8e8fb365 100644 --- a/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashOfMemoryConsumerLoadBalancer.java +++ b/net/src/main/java/com/zfoo/net/consumer/balancer/ConsistentHashOfMemoryConsumerLoadBalancer.java @@ -2,8 +2,12 @@ package com.zfoo.net.consumer.balancer; import com.zfoo.net.NetContext; import com.zfoo.net.session.Session; +import org.apache.curator.shaded.com.google.common.collect.Lists; import org.apache.curator.shaded.com.google.common.util.concurrent.AtomicLongMap; +import java.util.List; +import java.util.Map; + /** * 记忆化一致性hash * @@ -46,4 +50,8 @@ public class ConsistentHashOfMemoryConsumerLoadBalancer extends ConsistentHashCo } return loadBalancer; } + + public static Map getUid2sidMap(){ + return uid2sidMap.asMap(); + } }