【发布时间】:2015-03-12 07:35:20
【问题描述】:
我刚刚开始使用 Akka,我正在尝试了解演员池和组之间的区别以及何时使用哪个。在doc 中,它简要说明了一个组不是由路由器创建的,所以这意味着他们没有主人?
在下面的情况下,您可以直接将消息从一个工作组(或池?)路由到另一个而不通过 Master 发送吗?
【问题讨论】:
我刚刚开始使用 Akka,我正在尝试了解演员池和组之间的区别以及何时使用哪个。在doc 中,它简要说明了一个组不是由路由器创建的,所以这意味着他们没有主人?
在下面的情况下,您可以直接将消息从一个工作组(或池?)路由到另一个而不通过 Master 发送吗?
【问题讨论】:
关于区别:
有时,不是让路由器参与者创建它的路由,而是 最好单独创建路由并将它们提供给 路由器供其使用。您可以通过传递 routees 的路径来做到这一点 到路由器的配置。消息将与 ActorSelection 这些路径。
所以不同之处在于,在“池”的情况下,您的工作人员是由池自动创建(和监督)的。在“组”的情况下 - 您必须首先创建参与者,然后将路径列表(将在 ActorSelection 中使用)传递给这些参与者到主节点:
val router: ActorRef = // group's master, but not supervisor
context.actorOf(RoundRobinGroup(List("/user/workers/w1", "/user/workers/w2", "/user/workers/w3")).props(), "router4")
所以,两者都有一个主actor (router),但在第二种情况下,worker 是由另一个actor手动创建的 - 所以这个另一个actor默认监督它们(当然,如果它们不是顶级的) 并接收生命周期消息。因此,这里有 3 种参与者:master、supervisor(s)、workers。
关于“直接”路由。每个组/池都有自己的合成主actor,因此当您向组发送消息时,它总是先发送给主actor。但是,如果您知道组成员的地址(如上例中的“/user/workers/w1”),则没有什么能阻止您直接向工作人员发送消息。
【讨论】: