scala - 后台作业服务,如何确保每个集群的作业只定期运行一次

标签 scala playframework playframework-2.0 couchdb jobs

我有一个基于 Play Framework 的服务,它是无状态的,旨在跨多台机器部署以进行水平扩展。

此服务正在处理 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(分布式互斥锁?不完全是?)之上放置一个公认的算法来做到这一点?

我不想让任何实例变得“特殊”,因为它需要非常易于部署和管理。

最佳答案

查看 Akka 的 Cluster Singleton Pattern .

For some use cases it is convenient and sometimes also mandatory to ensure that you have exactly one actor of a certain type running somewhere in the cluster.

Some examples:

  • single point of responsibility for certain cluster-wide consistent decisions, or coordination of actions across the cluster system
  • single entry point to an external system
  • single master, many workers
  • centralized naming service, or routing logic

Using a singleton should not be the first design choice. It has several drawbacks, such as single-point of bottleneck. Single-point of failure is also a relevant concern, but for some cases this feature takes care of that by making sure that another singleton instance will eventually be started.

关于scala - 后台作业服务,如何确保每个集群的作业只定期运行一次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18615048/

相关文章:

斯卡拉玩!使用 anorm 或 ORM

java - Play框架-在post请求中传递多个图像

scala - 为什么这个 LR 代码在 spark 上运行太慢?

Scala:返回 bool 值的模式匹配的缩写形式

playframework - 由于构建或路由而导致 Play Framework 2.4 编译错误

java - 在服务器启动时使用 Akka 运行框架调度程序

playframework - Play 框架消息中的 html 标记

scala - 使用 sbt 和 testng 时,如何获得测试中引发的异常的完整堆栈跟踪?

mysql - 光滑的代码生成器不包括带表的模式

Java Play框架解析JSON错误