2013-09-04 1 views
3

У меня есть служба на основе фреймворка, которая является безстоящей и предназначена для развертывания на многих машинах для горизонтального масштабирования.Служба с фоновыми заданиями, как обеспечить, чтобы задания выполнялись периодически ОДИН за один кластер

Эта служба обрабатывает запросы и ответы HTTP JSON и снова использует CouchDB как хранилище данных для максимальной масштабируемости.

У нас есть небольшое количество фоновых заданий, которые нужно запускать каждые X секунд по всему кластеру. Очень важно, чтобы задания не выполнялись одновременно на каждой машине.

Для выполнения работ мы используем Actors и Akka планировщика (так как мы используем 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()) 
    } 
} 

Есть:

  • любой встроенный обман в Акке/Актеры/Игра, которую я пропустил, сделает это для меня?
  • ИЛИ признанный алгоритм, который я могу поставить поверх Couchbase (распределенный мьютекс? Не совсем?), Чтобы сделать это?

Я не хочу делать какие-либо экземпляры «специальных», поскольку их очень просто развертывать и управлять.

+0

У меня такая же проблема, как у вас. У меня есть приложение для воспроизведения, которое имеет планировщик akka, который запускается каждые 12 часов и выполняет определенную операцию БД. Но я хочу, чтобы он запускался один раз в кластере. В противном случае, если у меня есть 2 узла кластера, а в 4 раза он будет работать, я хочу, чтобы он был всего два раза в день. Как мы можем достичь этого? – CodeGuru

ответ

1

Оказывается, Akka's Cluster Singleton Pattern.

В некоторых случаях использование удобно, а иногда также обязательно убедиться, что у вас есть ровно один актер определенного типа работает где-то в кластере.

Некоторые примеры:

  • единая точка ответственности за некоторых Кластера последовательных решений, или координации действий в рамках всей системы кластера
  • единая точка входа для внешней системы
  • одного мастера, многие работники
  • централизованной службы именования, или логика маршрутизации

Использование синглтон не должен быть первым выбором дизайна. Он имеет несколько недостатков, например, одноточечное узкое место. Одиночная ошибка также является актуальной проблемой, но в некоторых случаях эта функция позаботится об этом, убедившись, что в конце концов будет запущен другой экземпляр одиночного экземпляра .

+0

Это выглядит очень хорошо, моя единственная оговорка в том, что он использует протокол сплетен, чтобы получить возможную согласованность, когда у нас есть хорошее хранилище данных, которое сидит там для синхронизации!Я просмотрел документы и не могу найти информацию о том, как вытащить протокол сплетен для чего-то другого - знаете ли вы, стоит ли это времени или нет? –

+0

Я сомневаюсь, что это возможно. Протокол сплетен является основной частью кластера Akka. – sourcedelica

+0

У меня такая же проблема, как у вас. У меня есть приложение для воспроизведения, которое имеет планировщик akka, который запускает и выполняет определенную операцию DB. Но я хочу, чтобы он запускался один раз в кластере. Как мы можем достичь этого? – CodeGuru

 Смежные вопросы

  • Нет связанных вопросов^_^