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

Min*_*ing 7 scala playframework playframework-2.0 playframework-2.3

在典型的Web应用程序中,有些事情我更喜欢作为延迟的作业/任务运行.他们往往具有以下部分或全部属性:

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

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

更多细节...

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

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

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

我过去遇到的例子包括:

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

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

  • 在Ruby + Rails应用程序中使用Resque
  • Celery在Python + Django应用程序中

我发现了以下现有材料,但遗憾的是,我不认为它们直接适合我的用例.

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

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

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

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

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

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