Akka调度程序和路由器

5
阅读了Akka文档和一些在线帖子后,我仍然没有清楚理解路由器和调度程序之间的关系。
1)路由器是否总是使用调度程序来分派到被路由的对象?路由器可以在不使用调度程序的情况下完成工作吗?
2)如果配置中没有定义其他调度程序,我的理解是将使用默认调度程序。在我的actor系统中,我有一个包含两个生产者actor和三个消费者actor的集群,生产者和消费者都在不同的JVM上运行--对于一个actor系统拥有一个默认调度程序是什么意思?
我的理解是,调度程序就像线程池执行程序。在这种情况下,在不同的JVM中,每个JVM都会有自己的调度程序实例和线程池执行程序,对吗?
3)与上述问题相关(https://doc.akka.io/docs/akka/current/dispatchers.html#problem-blocking-on-default-dispatcher):

使用context.dispatcher作为阻塞Future执行的分发器可能会有问题,因为除非为Actor设置单独的分发器,否则默认情况下此分发器用于所有其他Actor处理。

如果Actor在不同的JVM中运行,上述内容是否仍适用?如果是,这意味着什么?


相关内容:https://dev59.com/vl0a5IYBdhLWcg3wLV8G#30634989 - hveiga
我猜这个问题已经在堆栈溢出上被问过了。请您查看 https://dev59.com/vl0a5IYBdhLWcg3wLV8G#30634989 和 https://dev59.com/Vpvga4cB1Zd3GeqP57IT - Chaitanya
2个回答

2
(1a) 路由器是否总是使用调度程序来分派到路由器?
是的。
(1b) 路由器是否可以在不使用调度程序的情况下完成其工作?
不行。所有的演员,无论它们是否是路由器,都运行在调度程序上。
(2) …在不同的 JVM 中,每个 JVM 都会有自己的调度程序实例和自己的线程池执行者,对吗?
是的,本质上是这样的。如果您的系统由多个 JVM 组成,则每个 JVM 将拥有自己的 ActorSystem(例如,使用 Akka Cluster)。每个 ActorSystem 独立地配置其自己的调度程序,与任何其他 ActorSystem 无关。1 如果您没有添加调度程序,则将使用默认调度程序。
(3)“使用 context.dispatcher 作为阻塞 Future 执行的调度程序可能会有问题,因为该调度程序默认用于所有其他演员处理,除非您为演员设置了单独的调度程序。”
如果演员在不同的 JVM 中运行,上述内容是否仍然适用?如果是,它意味着什么?
是的,处理阻塞操作的指南适用于在多个JVM上运行的Actor。每个JVM都将拥有自己的ActorSystem,并且每个ActorSystem都需要设置一个专用的调度程序来处理阻塞操作,正如您引用的文档所建议的那样。
实际上,你可以在一个 JVM 上拥有多个 ActorSystem。来自 文档 的说明如下:

几个具有不同配置的 actor 系统可以在同一 JVM 中共存而不会出现问题,Akka 本身没有全局共享状态。


谢谢Jeffrey! 非常有帮助。1)我有生产者演员和消费者演员,它们都在不同的JVM中运行,都使用默认调度程序。每个JVM中只有一个消费者演员。我的消费者演员正在阻塞,因为每个作业需要几分钟时间。根据文档,我们是否应该关注生产者默认调度程序还是消费者默认调度程序中的线程饥饿问题?我认为消费者方面不应该是一个问题,因为JVM中只有一个演员。从生产者方面来看,线程会被阻塞,等待来自消费者演员的答案吗? - mystackoverflow
  1. 你能解释一下调度程序和邮箱之间的关系吗?调度程序可以由ThreadPoolExecutor实现。ThreadPoolExecutor内部有一个包含任务的队列,我认为邮箱是ThreadPoolExecutor内部队列的表示形式?
- mystackoverflow

2
Jeffreys的回答很好,但需要进行一些小的更正:可以运行一个路由器来在调用线程上路由消息(参见文档中的第一个示例),该线程可能是任意非actor线程,因此本身不需要调度程序。
然而,路由器路由到的actor,像任何其他actor一样,始终会在调度程序上运行。
将路由器作为单独的actor运行也很常见,在这种情况下,它将在调度程序上运行(在路由器文档的第二部分中描述)。
邮箱是actor的消息队列,将消息放入其中将导致actor处理该消息(或一批消息)并安排在调度程序上执行。当邮箱为空时,actor不会被安排执行,这意味着大量的actors可以与少量的线程共享调度程序。
如果其中一个演员需要“几分钟”才能执行,那么这可能导致饥饿——没有其他演员能够执行,包括处理集群状态和Akka内部的演员,因此将它们隔离到自己的调度程序中非常重要。请参见文档的需谨慎考虑阻塞需求部分

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接