Akka 调度器和路由器

mys*_*low 5 multithreading scala akka

看了Akka的文档和网上的一些帖子,我对路由器和调度器的关系还是没有很清楚的认识。

1) 路由器是否总是使用调度器来调度给路由?路由器可以在不使用调度程序的情况下完成其工作吗?

2)如果配置中没有定义额外的调度器,我的理解是会使用默认的调度器。在我的 actor 系统中,我有一个集群,其中包含两个使用路由器 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 设置单独的调度器。

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

Jef*_*ung 2

(1a) 路由器是否总是使用调度程序来调度路由对象?

是的。

(1b) 路由器可以在不使用调度程序的情况下完成其工作吗?

不。所有参与者,无论它们是否是路由器,都在调度程序上运行。

(2) ...在不同的JVM中,每个JVM不是都有自己的调度程序实例和自己的线程池执行程序吗?

是的,本质上是。如果您的系统由多个 JVM 组成,那么每个 JVM 都会有自己的ActorSystem(例如,使用 Akka Cluster)。每个都ActorSystem独立于任何其他配置自己的调度程序ActorSystem1如果您不添加调度程序,将使用默认调度程序。

(3) “使用 context.dispatcher 作为阻塞 Future 执行的调度程序可能会出现问题,因为该调度程序默认用于所有其他 actor 处理,除非您为 actor 设置单独的调度程序。”

如果参与者运行在不同的 JVM 中,上述内容仍然适用吗?如果是这样,这意味着什么?

是的,如果您有在多个 JVM 上运行的 Actor,则有关处理阻塞操作的准则将适用。每个 JVM 都有自己的ActorSystem,并且每个 JVM 都ActorSystem需要设置一个专用的调度程序来处理阻塞操作,正如您引用的文档所建议的那样。


1ActorSystem事实上,一台JVM 上可以有多个。从文档中:

具有不同配置的多个 Actor 系统可以毫无问题地共存于同一个 JVM 中,Akka 本身不存在全局共享状态。