From 65e1fdc41667a30bdb90ed636355fa4080756109 Mon Sep 17 00:00:00 2001 From: jaysunxiao Date: Thu, 28 Oct 2021 18:57:38 +0800 Subject: [PATCH] =?UTF-8?q?doc[net]:=20=E6=9B=B4=E6=96=B0=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/zfoo/net/task/TaskBus.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/net/src/main/java/com/zfoo/net/task/TaskBus.java b/net/src/main/java/com/zfoo/net/task/TaskBus.java index bc362d26..7e4fd744 100644 --- a/net/src/main/java/com/zfoo/net/task/TaskBus.java +++ b/net/src/main/java/com/zfoo/net/task/TaskBus.java @@ -61,6 +61,24 @@ public final class TaskBus { } + /** + * Actor模型,最主要的就是线程模型,Actor模型保证了某个Actor所代表的任务永远不会同时在两条线程同时处理任务,这就就避免了并发。 + * 无论是Java,Kotlin,Scala都没有真正的协程,所以最终做到Actor模型的只能是细致的控制线程。 + *

+ * zfoo中通过对线程池的细粒度控制,从而实现了Actor模型。 + * 为了简单,可以把Actor可以理解为一个用户或者一个玩家。 + * 因为同一个用户或者玩家的uid是固定的,通过uid去计算一致性hash(executorConsistentHash)永远会得到一致的结果, + * 从而保证同一个用户或者玩家的请求总能通过executorConsistentHash被路由到同一台服务器的同一个线程去执行,从而避免了并发,实现了无锁化。 + *

+ * zfoo所代表的Actor模型,是更加精简的Actor模型,让上层调用无感知,在zfoo中可以简单的理解 actor = executorConsistentHash。 + *

+ * 在zfoo这套线程模型中,保证了服务器所接收到的Packet(最终被包装成PacketReceiverTask任务),永远只会在同一条线程处理, + * TaskBus通过AbstractTaskDispatch去派发PacketReceiverTask任务,具体在哪个线程处理通过IAttachment的executorConsistentHash计算。 + *

+ * IAttachment的不同,executorConsistentHash也不同: + * GatewayAttachment:默认是executorConsistentHash等于用户活玩家的uid,也可以通过IGatewayLoadBalancer接口指定 + * SignalAttachment:executorConsistentHash通过IRouter和IConsumer的argument参数指定 + */ public static void submit(PacketReceiverTask task) { taskDispatch.getExecutor(task).execute(task); }