【问题标题】:In the playframework how do I prioritize io threads over akka actors?在 playframework 中,我如何将 io 线程优先于 akka 演员?
【发布时间】:2013-01-22 04:15:18
【问题描述】:

我正在 play 2.0 框架上编写一个应用程序。这个应用程序的目的是处理图像上传并在后台调整它们的大小。

上传是通过一个将文件保存到文件系统的标准后处理程序来处理的。现在这只是在事件或 IO 线程上完成的。成功保存文件后,会向 AKKA 演员发送一条消息,将原始图像的大小调整为多种不同的尺寸(目前为 4 种)。这些调整大小操作对 CPU 要求很高,并且需要一些时间。

这一切都很好,直到我在一些负载下测试应用程序。在负载下,调整大小操作实际上消耗了所有可用的 CPU 时间,因此传入的 HTTP 请求有点缺乏 CPU 时间,我们看到这些请求积压到最终请求开始超时的地步。

所以问题是,我如何配置系统(或重写它)以赋予传入的 HTTP 请求比调整大小请求更高的优先级?

【问题讨论】:

  • 有趣的话题,您是否考虑过使用外部图形库+构建图像队列来调整大小(即在数据库中)?在这种情况下,您可以减慢队列执行速度,甚至在流量巨大的情况下停止它
  • 由于空间问题,我们正在尝试从数据库中的排队图像迁移。

标签: playframework-2.0 akka


【解决方案1】:

您应该调查dispatcher in Akka。基本上,它们抽象了每个参与者用于处理的线程/工作池。您可以定义一个全局调度程序或拥有多个调度程序。

定义只有有限数量线程(1 或 2)的调度程序:

resizing-thread-pool-dispatcher {
  type = Dispatcher
  executor = "thread-pool-executor"
  thread-pool-executor {
    core-pool-size-max = 1
  }
}

并将其与调整大小的演员相关联:

context.
  actorOf(
    Props[ResizingActor].withDispatcher("resizing-thread-pool-dispatcher"), 
    "resizingActor"
  )

当然,这个想法是您的 resizing-thread-pool-dispatcher 使用的线程少于可用内核,因此您的 HTTP 线程仍然可以响应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-03
    • 2016-04-28
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多