Akka中actor pools和groups的区别

5
我刚开始学习Akka,并且正试图理解actor池和actor组之间的区别以及何时使用它们。在文档中简要地提到,组不是由路由器创建的,那么这意味着它们没有 master(主)吗?
在下面的情况中,是否可以直接从一个工作组(或池)路由消息到另一个工作组(或池),而无需通过Master(主)发送它?
1个回答

6

关于差异:

有时,与其让路由器Actor创建它的路由方案,更好的做法是单独创建路由方案并将其提供给路由器使用。您可以通过向路由器的配置传递路由方案的路径来实现此目的。消息将通过ActorSelection发送到这些路径。

因此,“pool”的情况下,您的工作进程会自动由池创建(和监控)。“group”情况下 - 您首先必须创建演员,然后将路径列表(将在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种类型的演员:主演员、监督者和工人。

关于“直接”路由。每个组/池都有自己的合成主演员,因此当您向组发送消息时,它总是先到达主演员。但是,如果您知道组成员的地址(例如上面的“/user/workers/w1”),则可以直接向工人发送消息。


你能否发送一个广播给“/user/workers/”中的所有成员,而不是单个成员? - K-RAD
我的意思是,从左侧组发送到右侧组,而无需将其发送到主机(并在主机中有另一个“情况”将其转发到右侧组)。 - K-RAD
正如我所说的,“它总是首先到主节点”,实际上主节点所做的是向其列表中的每个工作者发送消息。你也可以这样做(我的意思是,如果你创建了“/user/workers/w1”,w2等,你知道它们的地址——你可以发送消息给列表中的每个演员,但没有办法广播消息给“/user/workers/”。但我看不出任何逻辑上的区别,因为主节点是自动创建的(而不是手动创建的),它是合成的,并且对你完全透明。 - dk14
顺便提一下,如果你只是想要广播而不是负载均衡 - http://doc.akka.io/docs/akka/snapshot/scala/event-bus.html - dk14

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接