如何在事件驱动架构中初始化 scala/akka Actor



我有很长的运行进程,假设 2 小时到 1 天。每个进程都以更新消息开始其生命周期,然后继续侦听进一步的并发更新。在更新消息中有一个唯一的目标标识符。

如果我想用Actor表示每个进程,如何初始化Actor?我显然需要根据更新消息中标识符的值执行原子查找/创建操作?如何使用 scala/akka 设计它?

设置一个执行这些进程参与者管理的单个参与者(例如ProcessManager参与者)。 此执行组件将支持获取特定进程 ID 的进程执行组件的请求。 在内部,它将查看该孩子是否已经存在。 如果存在,它将使用该引用响应sender。 如果没有,它将创建它,然后使用该 ref 响应sender。 由于此管理器参与者按顺序处理其邮箱(与所有参与者一样),因此您不必担心查找/创建的争用条件。 一个非常简单的例子:

case class GetProcessHandler(processId:Int)
class ProcessManager extends Actor{
  def receive = {
    case GetProcessHandler(id) =>
      val name = s"proc_$id"
      val handler = context.child(name).getOrElse(
        context.actorOf(Props[ProcessHandler], name)
      )
      sender ! handler
  }
}
class ProcessHandler extends Actor{
  def receive = {
    ...
  }
}
您可以在

application.conf中指定起始演员。然后,您的main程序可以使用您的Actor系统创建/初始化这些Actor。

最新更新