如何在多个流程中安排全球期间的Akka工作?

时间:2013-03-31 08:18:17

标签: scala playframework quartz-scheduler akka playframework-2.1

我在Play Framework中使用Akka而不是Job,来安排代码每X秒运行一次。我有一种集群(在Heroku上运行,目前在1 dyno上,但偶尔会有一些并发实例)。

是否有一种简单的方法可以在整个群集中每隔N秒运行一次“作业”?我知道Quartz支持进程外存储/同步机制,例如DB - 我可以在Scala中使用类似的东西吗?

这是在Play start:

上运行的actor设置
object Global extends GlobalSettings {

  override def onStart(app: Application) {
    val monitorActor = Akka.system.actorOf(Props[MonitorLoadJob], name = "monitorLoad")
    Akka.system.scheduler.schedule(0 seconds, 10 seconds, monitorActor, Tick)
  }
}

3 个答案:

答案 0 :(得分:9)

结帐ClusterSingletonManager

  

对于某些用例,它很方便,有时也是强制性的   确保您只有一个特定类型的actor正在运行   集群中的某个地方。

     

一些例子:

     
      
  • 对于某些群集范围的一致性决策或整个群集系统中的操作协调的单一责任
  •   

它需要运行Akka Cluster,但它是针对这种情况而制作的。

答案 1 :(得分:0)

一种可能的方法是让一个actor在每个节点上运行,等待通知消息来启动这个作业,并从调度程序广播消息给这些actor。

答案 2 :(得分:0)

或者您可以使用专用于工作的worker dyno,使用标准main方法安排您的工作与Akka。

您可以查看this link(对于Java,但您会了解Scala的想法)。