3

我有一个基于游戏框架的服务,它是无状态的,旨在部署在多台机器上以实现水平扩展。

该服务正在处理 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")

(ETC)

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 之上(分布式互斥锁?不完全?)来做到这一点?

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

4

1 回答 1

2

查看 Akka 的集群单例模式

对于某些用例,确保您在集群中的某处运行特定类型的特定参与者是很方便的,有时也是强制性的。

一些例子:

  • 对某些集群范围内的一致决策或跨集群系统的行动协调的单点责任
  • 外部系统的单一入口点
  • 单主,多人
  • 集中命名服务或路由逻辑

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

于 2013-09-04T23:54:22.560 回答