我刚刚开始使用Akka,我正在尝试理解actor池和组之间的区别以及何时使用哪个。在doc中,它简要地说一个组不是由路由器创建的,这意味着它们没有主服务器?
在下面的情况中,您是否可以直接将消息从一个工作组(或池?)路由到另一个工作组(而不是通过主服务器发送?)
答案 0 :(得分:6)
关于差异:
有时候,不是让路由器演员创建路线,而是 希望单独创建路由并将它们提供给 路由器供其使用。您可以通过传递路由的路径来完成此操作 到路由器的配置。邮件将随附发送 ActorSelection到这些路径。
所以区别在于,在“池”的情况下,池中会自动创建(并监督)您的工作者。如果是“group” - 您必须首先创建actor,然后将路径列表(将在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")
所以,两者都有一个主演员(router
),但在第二种情况下,工作人员是由另一个演员手动创建的 - 所以这个另一个演员默认监督他们(如果他们不是顶级的话,当然)和接收生命周期信息。因此,您在这里有3种演员:主人,主管,工人。
关于“直接”路由。每个组/池都有自己的合成主actor,因此当您向组发送消息时,它总是首先转到主节点。但是,如果您知道组成员的地址(例如上面示例中的“/ user / workers / w1”),则不会阻止您直接向工作人员发送消息。