在Play framework 2.x app中调度/延迟作业/任务

时间:2015-03-31 05:48:57

标签: scala playframework playframework-2.0 playframework-2.3

在典型的网络应用程序中,我希望将某些内容作为延迟作业/任务运行。它们往往具有以下部分或全部属性:

  • 需要很长时间(从几秒到几分钟到多个小时)。
  • 大量占用某些资源(CPU,网络,磁盘,外部API限制等)
  • 结果不是立即需要的。没有它就可以完成HTTP响应。好的(甚至可能更好)延迟到晚些时候。
  • 可以(并且可能更喜欢)在(a)不同的机器上运行,而不是Web服务器。这些机器可能是专职的工作/任务选手。
  • 应该响应其他事件而运行,或者定期启动。

在Scala + Play Framework 2.x应用中设置,排队,安排和运行延迟作业/任务的首选方式是什么?

了解更多详情......

我过去使用的模式,如果适用,我想复制的模式是:

  • 在Web请求的处理程序中,或在类似cron的调用中,将队列排入队列
  • 在工作跑步者中,反复出列并一次开展一项工作
  • 可能处理录制工作结果

这似乎是一种相对简单但仍然相对灵活的模式。

我过去遇到的例子包括:

  • 在DB中更新派生数据
  • 分析/跟踪API调用Web请求
  • 删除过期的会话或其他陈旧/过时的数据库记录
  • 定期批处理ETL

在其他语言/框架中,我通常会使用作业/任务框架。例子包括:

  • Ruby + Rails应用程序中的Resque
  • Python + Django应用程序中的芹菜

我找到了以下现有材料,但不幸的是,我认为它们不适合我的用例。

  • Play 1.x asynchronous jobs API(+各种SO问题引用它)。似乎已在2.x行中删除。没有提到取代它的内容。
  • Play 2.x Akka integration。似乎非常通用。我想可以使用Akka进行上述操作,但如果已经存在,我宁愿不编写作业/任务框架。此外,没有关于如何将作业运行器机器与Web服务器分开的信息。
  • This SO answer。对于“短到中等持续时间的IO绑定”情况似乎有希望,例如,分析调用,但不一定是“CPU绑定”情况(可能不应该绑定Web服务器上的CPU,更喜欢发送到不同的节点),“大量网络”情况,或“多小时”情况(可能不应该将它留在Web服务器的后台,即使它没有占用太多资源)。
  • This SO question, and related questions。与上面类似,在我看来,这仅涵盖了在同一个Web服务器上运行的情况。

进一步澄清用例(根据评论者的要求)。我尝试在这里复制的resque或芹菜等有两个主要用例:

  • 网站上的某些事件(通常,传入的网络请求会导致任务入队。)
  • 任务应定期运行。 (大多数情况下,这实现为:定期执行,将任务排入上面运行。)

对于resque或celery,两个用例排队的任务以相同的方式进入队列,并由runner / worker进程以相同的方式处理。除了其他Scala或Play特定的考虑因素,这将是我对如何处理此问题的初步猜测。

进一步澄清为什么我不相信Akka调度程序适合我的开箱即用(根据评论者的要求):

虽然毫无疑问可以使用Akka调度程序(用于定期作业),akka-remote和akka-cluster(用于在作业调用者和作业运行者之间进行通信)的某种组合来构建适合的解决方案,但这种方法需要一定数量的胶水代码,几乎是一个延迟的工作框架本身。如果它存在,我宁愿使用现有的开箱即用的解决方案,而不是重新发明轮子。

0 个答案:

没有答案