Akka路由器的重要性

Yad*_*nan 7 scala actor akka

对于Akka路由器的重要性,我对此持怀疑态度.我在我正在进行的当前项目中使用了Akka Routers.但是,我对它的重要性感到有些困惑.在以下两种方法中,哪种更有益.

  1. 有路由器和路由器.
  2. 根据需要创建尽可能多的演员.

我知道路由器会根据策略在其路由中分配传入消息.此外,我们可以有基于路由器的管理员策略.我也明白演员也是轻量级的,并不是创造尽可能多的演员的开销.因此,我们可以为每个传入消息创建actor,并在处理完成后根据需要将其终止.

所以我想了解上面哪一项设计更好?或者换句话说,在这种情况下(1)优于(2)或反之亦然.

yǝs*_*ǝla 12

好问题.在阅读Akka文档之前,我有类似的疑虑.原因如下:

  1. 效率.来自docs:

    表面路由器看起来像普通演员,但实际上它们的实现方式不同.路由器旨在非常有效地接收消息并将其快速传递给路由器.

    普通的actor可以用于路由消息,但是actor的单线程处理可能成为瓶颈.通过优化通常允许并发路由的消息处理管道,路由器可以实现更高的吞吐量.这是通过将路由器的路由逻辑直接嵌入其ActorRef而不是路由器actor中来实现的.发送到路由器的ActorRef的消息可以立即路由到routee,完全绕过单线程路由器actor.

    当然,成本是路由代码的内部比使用普通参与者实现路由器更复杂.幸运的是,所有这些复杂性对于路由API的消费者来说都是不可见的.但是,在实现自己的路由器时需要注意的事项.

  2. 多个路由策略的默认实现.你总是可以写自己的,但它可能会变得棘手.您必须考虑监督,恢复,负载平衡,远程部署等.

  3. Akka路由器模式对Akka用户来说很熟悉.如果您推出自定义路由,那么每个人都必须花时间了解所有极端情况和影响(+测试?:)).

TL; DR如果你不太关心效率,如果你更容易产生新的演员,那就去吧.否则使用路由器.

  • 创建演员的成本非常低,在这里不是一个问题。路由器本质上是通过“绕过”路由参与者将消息直接从客户端转发到工作线程来提高消息路由的性能。如果您使用常规参与者实现路由,则所有消息都必须在其邮箱上排队并转发给工作人员,这是您可能希望避免的额外跃点。示意性地:`Client->(AkkaRouter)->Worker` 与 `Client->YourRouter->Worker`。其中“(X)”表示将被绕过的跃点。 (2认同)