【问题标题】:Difference between actor pools and groups in AkkaAkka 中演员池和组之间的区别
【发布时间】:2015-03-12 07:35:20
【问题描述】:

我刚刚开始使用 Akka,我正在尝试了解演员池和组之间的区别以及何时使用哪个。在doc 中,它简要说明了一个组不是由路由器创建的,所以这意味着他们没有主人?

在下面的情况下,您可以直接将消息从一个工作组(或池?)路由到另一个而不通过 Master 发送吗?

【问题讨论】:

    标签: akka actor


    【解决方案1】:

    关于区别:

    有时,不是让路由器参与者创建它的路由,而是 最好单独创建路由并将它们提供给 路由器供其使用。您可以通过传递 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”),则没有什么能阻止您直接向工作人员发送消息。

    【讨论】:

    • 您可以向“/user/workers/”中的所有人而不是单个成员发送例如广播吗?
    • 我的意思是,从左组发送到右组,而不必发送给 Master(并且在 Master 中有另一个“案例”将其转发给右组)
    • 正如我所说的“它总是先发给主人”,实际上主人正在做的是向其列表中的每个工人发送消息。没有什么能阻止你做同样的事情(我的意思是,如果你创建了“/user/workers/w1”、w2 等,你知道他们的地址 - 你可以向列表中的每个参与者发送消息,但没有办法向“/user/workers/”广播消息。但我没有看到任何逻辑差异,因为主节点是自动创建的(而不是手动创建的),它对您来说是合成的并且完全透明。
    • 顺便说一句,如果您正在寻找广播而不是负载平衡 - doc.akka.io/docs/akka/snapshot/scala/event-bus.html
    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2012-07-05
    • 2015-02-16
    相关资源
    最近更新 更多