如果不定义Router,Akka Actor运行会并行吗?

Does Akka Actor run in parallel if we do not define a Router?

我对Akka系统中的Router、Dispatcher、Executor不是很清楚

如果我没有定义路由器,因此不给它一个组演员,演员是否并行运行?

如果我不定义路由器,而是定义和使用调度程序:

my-dispatcher {
  type = Dispatcher
  executor = "fork-join-executor"
  fork-join-executor {
    parallelism-min = 2
    parallelism-factor = 2.0
    parallelism-max = 10
  }
  throughput = 100
}

actor是否并行?

If I do not define a router and therefore do not give it a group actors, the actor runs in parallel or not?

Actor 系统中的 Dispatcher 是 ExecutionContext 的包装器,它有一个底层线程池,它在上面执行 actors。如果你创建的只是一个 单个 actor 并将消息传递给它,那么所有消息将到达同一个 actor 邮箱,他将逐一处理。 actor 内部的执行同步.

如果您希望多个参与者处理一个请求,那么这正是路由器的用途。如果你想要一组可以相同处理请求的演员,你分配一个路由器,它会为你管理这组演员,注意哪个演员得到多少工作量。

一个例子是当你有一个路由器并且你定义了一个内部演员池,即 RoundRobinPool 它只是以循环方式将消息分配给演员邮箱:

context.actorOf(
  Props(new MyActor())
    .withRouter(RoundRobinPool(nrOfInstances = 10)), name = "MyRouter")

这将创建一个 Router 和一个包含 10 个演员的 RoundRobinPool

消息在 Actor 中串行执行

所以说"one actor is no actor"

向演员发送消息时。它落在演员邮箱内。邮箱中的消息以串行方式一个接一个地处理。这里要注意的一件重要事情是,actor 确保每个消息行为都在单个线程中执行,它可以是不同的线程。

因此路由器创建了一组参与者并将消息路由到一组参与者,以便每个参与者同时并以并行方式处理它