使用后台作业进行服务,如何确保作业仅在每个群集上定期运行

时间:2013-09-04 13:22:18

标签: scala playframework playframework-2.0 couchdb jobs

我有一个基于Play框架的服务,该服务是无状态的,旨在部署在许多机器上以进行水平扩展。

此服务正在处理HTTP JSON请求和响应,并再次使用CouchDB作为其数据存储,以实现最大的可伸缩性。

我们需要在整个群集中每隔X秒运行少量后台作业。至关重要的是,作业不能在每台机器上同时执行。

要执行我们正在使用Actors和Akka Scheduler的作业(因为我们正在使用Scala):

Akka.system().scheduler.schedule(
    Duration.create(0, TimeUnit.MILLISECONDS),
        Duration.create(10, TimeUnit.SECONDS),
        Akka.system().actorOf(LoggingJob.props),
        "tick")

(等)

object LoggingJob {
    def props = Props[LoggingJob]
}

class LoggingJob extends UntypedActor {
    override def onReceive(message: Any) {
        Logger.info("Job executed! " + message.toString())
    }
}

有吗:

  • 我错过了Akka / Actors / Play的任何内置技巧会为我做这件事吗?
  • 或者我可以在Couchbase(分布式互斥体?不完全?)之上放置一个公认的算法来执行此操作?

我不想让任何实例“特殊”,因为它需要非常简单的部署和管理。

1 个答案:

答案 0 :(得分:2)

查看Akka的Cluster Singleton Pattern

  

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

     

一些例子:

     
      
  • 对于某些群集范围的一致性决策或整个群集系统中的操作协调的单一责任
  •   
  • 指向外部系统的单一入口点
  •   
  • 单一主人,许多工人
  •   
  • 集中命名服务或路由逻辑
  •   
     

使用单身不应该是第一个设计选择。它有   几个缺点,例如单点瓶颈。单点的   失败也是一个相关的问题,但在某些情况下这个功能   通过确保另一个单例实例来解决这个问题   最终开始。