我刚开始学习Akka,并且正试图理解actor池和actor组之间的区别以及何时使用它们。在文档中简要地提到,组不是由路由器创建的,那么这意味着它们没有 master(主)吗?
在下面的情况中,是否可以直接从一个工作组(或池)路由消息到另一个工作组(或池),而无需通过Master(主)发送它?
在下面的情况中,是否可以直接从一个工作组(或池)路由消息到另一个工作组(或池),而无需通过Master(主)发送它?
关于差异:
有时,与其让路由器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”),则可以直接向工人发送消息。