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); }