在阅读了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中运行,以上内容是否仍然适用?如果是这样,那是什么意思?
答案 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。