喜欢演员和消息处理
Akka Actors and Message Handling
我有一个 ActorSystem,我在其中创建了一个顶级 actor,在这个顶级 actor 中,我创建了几个子 actor。目前还不错!
然后我要做的是将这些子 actor 暴露给我的应用程序控制器(在 Play 应用程序中),这样我就可以直接通过管道从 Play 控制器传递给相应子 actor 的消息。这是一个好的做法,还是我应该始终通过主管将消息通过管道传递给儿童演员?在代码中,它如下所示:
class Application extends Controller with MyActors {
def createUser = { request =>
val user: User = ... get the User from the request body
userActor ! user
}
}
这是我的 Supervisor Actor 的样子,它由 Play 应用程序生命周期插件控制:
class SupervisorActor extends Actor with ActorLogging {
val allActors = MyActors(context.system.settings.config, context)
context watch allActors.userActor
// TODO: what should we do in this SupervisorActor?
def receive = {
case Terminated(terminate) => context stop self
case _ =>
}
}
然后我将这个 MyActors 注入到播放应用程序控制器中。所以我的问题是,这是一个好方法吗?子 actor 直接从外界接收消息,而无需通过 Supervisor actor。这是一个好方法吗?这种方法会遇到什么问题?
您的方法本身并无优劣之分。有些问题需要与 child Actor 直接沟通,有些需要使用主管。
我想说的是,如果您需要某种类型的路由逻辑,例如,联系主管是有益的。 1 条消息被广播给所有 child 个参与者或根据消息的内容进行路由。
另一方面,如果主管有其他职责并且您想分配工作量,直接联系 children 可能会更好。
我个人倾向于只与主管沟通,因为它允许 "single door" 方法。在代码的其他区域依赖注入主管通常也更容易,这样您就不必去查找 child ActorRef.
我有一个 ActorSystem,我在其中创建了一个顶级 actor,在这个顶级 actor 中,我创建了几个子 actor。目前还不错!
然后我要做的是将这些子 actor 暴露给我的应用程序控制器(在 Play 应用程序中),这样我就可以直接通过管道从 Play 控制器传递给相应子 actor 的消息。这是一个好的做法,还是我应该始终通过主管将消息通过管道传递给儿童演员?在代码中,它如下所示:
class Application extends Controller with MyActors {
def createUser = { request =>
val user: User = ... get the User from the request body
userActor ! user
}
}
这是我的 Supervisor Actor 的样子,它由 Play 应用程序生命周期插件控制:
class SupervisorActor extends Actor with ActorLogging {
val allActors = MyActors(context.system.settings.config, context)
context watch allActors.userActor
// TODO: what should we do in this SupervisorActor?
def receive = {
case Terminated(terminate) => context stop self
case _ =>
}
}
然后我将这个 MyActors 注入到播放应用程序控制器中。所以我的问题是,这是一个好方法吗?子 actor 直接从外界接收消息,而无需通过 Supervisor actor。这是一个好方法吗?这种方法会遇到什么问题?
您的方法本身并无优劣之分。有些问题需要与 child Actor 直接沟通,有些需要使用主管。
我想说的是,如果您需要某种类型的路由逻辑,例如,联系主管是有益的。 1 条消息被广播给所有 child 个参与者或根据消息的内容进行路由。
另一方面,如果主管有其他职责并且您想分配工作量,直接联系 children 可能会更好。
我个人倾向于只与主管沟通,因为它允许 "single door" 方法。在代码的其他区域依赖注入主管通常也更容易,这样您就不必去查找 child ActorRef.