Планирование задач в кластере идентичных узлов

Учитывая простое веб-приложение, работающее на AWS Elastic Beanstalk (то есть 1..n идентичных экземпляров за балансировщиком нагрузки), как я могу запланировать фоновую операцию, которая выполняется только на одном экземпляре?

У меня есть механизм планирования в веб-приложении, похожий на cron, и я могу использовать, например, AWS Simple Queue Service для постановки задач в очередь (и обеспечения того, чтобы каждая задача выполнялась только один раз). Но как сделать так, чтобы задачи создавал только один экземпляр (чтобы избежать дублирования)?

Очевидно, у меня мог бы быть выделенный экземпляр, отвечающий за создание задач, но я ищу более динамичный механизм, который позволяет одному из обычных экземпляров автоматически брать на себя эту роль. Любые идеи?


person ejain    schedule 11.01.2012    source источник


Ответы (2)


Похоже, это можно сделать с помощью Hazelcast: только самый старый узел в кластере (можно определить через API) создает задачи и ставит их в очередь.

person ejain    schedule 12.01.2012

Quartz Scheduler нам очень подходит. Узлы приходят и уходят в нашем beanstalk, и Quartz удается запустить задание на узле, который оказывается активным, когда планировщик указывает, что его нужно запустить. Поддерживает планирование в стиле cron, а также несколько других форматов. Он отказоустойчив и может запускать задания, которые были пропущены из-за того, что не было доступных экземпляров, когда задача должна была быть выполнена, или если узлу не удалось завершить выполнение.

Предполагается, что вы используете RDS или другую реляционную БД, которую Quartz может использовать в качестве постоянного хранилища.

person Jason    schedule 03.05.2012
comment
Так есть ли плагин для Quartz, который позволяет ему обнаруживать запущенные экземпляры в группе безопасности EC2 и координировать выполнение заданий? Или как предотвратить дублирование выполнения заданий? - person ejain; 03.05.2012
comment
Плагин не нужен, просто настройка. Например, указание всех узлов в вашей группе безопасности EC2 в одной базе данных для хранения их данных о заданиях Quartz автоматически приведет к их координации. Агенты Quartz на каждом узле проверяют детали задания, которые централизованно хранятся в базе данных. - person Jason; 07.05.2012
comment
Спасибо, нашел это: quartz-scheduler.org/documentation /quartz-2.x/tutorials/. Похоже, вам нужна либо реляционная база данных, либо Terracotta. - person ejain; 07.05.2012
comment
Точно (вот что такое RDS - MySQL или Oracle от Amazon) - person Jason; 09.05.2012
comment
Вы знаете, что есть реализация и для Dynamodb: github.com/azam/dynamodb-quartz - person Hannes; 29.01.2020