【问题标题】:Akka router, Futures and blocking operationAkka 路由器、Futures 和阻塞操作
【发布时间】:2015-08-08 23:43:06
【问题描述】:

我有一个 Master Actor,它使用路由器创建 Worker Actor。每个 Worker 参与者执行多个 HTTP 连接。

从几个来源我了解到,如果演员做一些阻塞操作,那么最好将阻塞操作包装到这个构造中:

val resFut = future {
  blocking {
    executeQuery()
  }
}

resFut pipeTo sender

但后来我读到 official topic 关于在 Akka 中处理阻塞操作,我很惊讶该主题建议仅使用路由器进行阻塞操作(作为 Futures 的替代品):

在一个参与者(或一组由一个 路由器),确保配置一个线程池 要么专门用于此目的,要么足够大。

所以我的问题是:我是否应该在我的 Worker Actor 中使用以下构造,即使它由路由器支持?

future {
      blocking {
        executeQuery()
      }
}

或者只是为路由器配置和使用另一个调度程序将帮助我获得相同的好处?

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    你可以做任何一个。您引用的文档基本上是说〜使用带有工人演员,单一演员或期货的路由器。

    整个想法是一个线程可能会阻塞,并且您希望正确管理它 - 您应该对阻塞的线程数设置上限。这可以通过控制路由数量的路由器来实现,或者通过手动控制并发运行的数量或使用有界线程池来实现。

    在任何一种情况下,如果您使用阻止的参与者,请使用其父级(控制器)与客户端进行通信。这样,如果工作角色因异常或超时而死亡,您的客户端仍将收到响应。因此,控制器不应该崩溃并响应多客户端请求。

    除非您觉得方便(例如使用带有超时的 pipeTo),否则无需同时使用 actor-per-request 模式和 future 包装阻塞代码。

    为了控制路由器中参与者的数量,有 2 个相关级别的配置。较低级别的配置是您的Dispatcher config,它定义了要使用的线程数。最重要的是Router config,它使用nrOfInstances 来控制可以存在多少个路由——上限。您应该将调度程序中的线程池大小设置为 NRouters * NRoutees 附近的某个位置,以进行阻塞操作。

    【讨论】:

    • 非常感谢您的帮助。但以防万一我想澄清一下:你写了by controlling number of routees。我认为您的意思是nr-of-instances 配置。但是你确定路由的数量吗?可能我需要指定类似parallelism-factor = 0.8 的东西吗?我认为nr-of-instances 不会指定将使用多少线程,但parallelism-factor = 0.8 会。提前致谢
    猜你喜欢
    • 2014-03-08
    • 2011-04-11
    • 2019-11-21
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-23
    相关资源
    最近更新 更多