Akka调度程序和路由器

时间:2018-10-25 00:39:47

标签: multithreading scala akka

在阅读了Akka文档以及一些在线文章之后,我仍然对路由器和调度程序之间的关系还不清楚。

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

2)如果在配置中没有定义其他调度程序,则我的理解是将使用默认调度程序。在我的角色系统中,我有一个集群,其中有两个使用路由器角色的生产者角色和三个消费者角色。生产者和消费者都运行在不同的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中运行,以上内容是否仍然适用?如果是这样,那是什么意思?

2 个答案:

答案 0 :(得分:2)

  

(1a)路由器是否始终使用分派器来分派给路由?

是的

  

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

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

  

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

是的,基本上是。如果您的系统由多个JVM组成,则每个JVM将具有自己的ActorSystem(例如,使用Akka Cluster)。每个ActorSystem都独立于其他ActorSystem来配置自己的调度程序。 1 如果不添加调度程序,则将使用默认调度程序。

  

(3)“将context.dispatcher用作在其上执行阻止Future的调度程序可能会遇到问题,因为默认情况下,除非为该actor设置了单独的调度程序,否则此调度程序默认用于所有其他actor处理。” / p>      

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

是的,如果您有在多个JVM上运行的参与者,则适用于处理阻塞操作的准则。每个JVM都有自己的ActorSystem,并且每个ActorSystem都需要按照您引用的documentation的建议设置专用的调度程序来处理阻塞操作。


1 实际上,JVM上可以有多个ActorSystem。来自documentation

  

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

答案 1 :(得分:1)

对Jeffreys进行了一些小的更正,否则给出了一个很好的答案:可以运行一个在呼叫线程上路由消息的路由器(请参阅first example in the docs),并且该线程可能是任意的非actor线程,因此本身并不需要调度程序。

路由器路由到的actor,就像其他actor一样,将始终在调度程序上运行。

将路由器作为单独的角色运行也很普遍,在这种情况下,它将在调度程序上运行(在second section of the router docs中进行了描述)。

邮箱是参与者的消息队列,在其中放入消息将导致参与者处理在调度程序上安排的消息(或一批消息)。当邮箱为空时,不会调度执行者,这意味着大量的执行者可以共享具有少量线程的调度程序。

如果其中一个参与者花费“几分钟”执行,这可能导致饥饿-没有其他参与者可以执行,包括处理群集状态和Akka内部的参与者,因此隔离它们很重要。交给自己的调度员。参见blocking needs careful consideration section of the docs