Хорошо это или плохо, но мы перенесли все наше веб-приложение LAMP с выделенных машин в облако (машины Amazon EC2). Пока все идет отлично, но то, как мы делаем crons, не оптимально. У меня есть специфический для Amazon вопрос о том, как лучше всего управлять заданиями cron в облаке, используя «путь Amazon».
Проблема : у нас есть несколько веб-серверов, и нам нужно запускать crons для пакетных заданий, таких как создание RSS-каналов, запуск электронных писем и многое другое. НО задания cron должны выполняться только на одном компьютере, потому что они часто записываются в базу данных, поэтому при запуске на нескольких машинах результаты будут дублироваться.
До сих пор мы обозначили один из веб-серверов как «главный веб-сервер», и у него есть несколько «специальных» задач, которых нет у других веб-серверов. Компромисс для облачных вычислений - надежность - нам не нужен «главный веб-сервер», потому что это единственная точка отказа. Мы хотим, чтобы все они были идентичными и чтобы можно было повышать и понижать масштаб, не забывая при этом, что главный веб-сервер не следует выводить из кластера.
Как мы можем перепроектировать наше приложение, чтобы преобразовать задания Linux cron в временные рабочие элементы, у которых нет единой точки отказа?
Мои идеи на данный момент:
- Сделайте машину, предназначенную только для бега. Это было бы немного более управляемым, но все равно было бы единичной точкой отказа, и было бы потрачено немного денег на дополнительный экземпляр.
- Некоторые задания можно было бы перенести из Linux crons в MySQL Events, однако я не большой поклонник этой идеи, поскольку я не хочу помещать логику приложения на уровень базы данных.
- Возможно, мы сможем запустить все crons на всех машинах, но изменить наши сценарии cron, чтобы все они начинались с небольшой логики, которая реализует механизм блокировки, так что только один сервер действительно выполняет действие, а другие просто пропускают. Я не фанат этой идеи, поскольку она звучит потенциально ошибочно, и я предпочел бы использовать передовой опыт Amazon, а не использовать собственные.
- Я представляю ситуацию, когда задания где-то планируются, добавляются в очередь, а затем каждый веб-сервер может быть рабочим, который может сказать: «Эй, я возьму это». Amazon Simple Workflow Service звучит именно так, но в настоящее время я мало что знаю об этом, поэтому любые подробности будут полезны. Это кажется тяжеловесным для чего-то такого простого, как cron? Это правильный сервис или есть более подходящий сервис Amazon?
Обновление: задав вопрос, я посмотрел веб-семинар Amazon Simple Workflow Service на YouTube и заметил в 34:40 ( http://www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s ) мельком слайд с упоминанием заданий cron в качестве примера приложения. На странице документации « Примеры AWS Flow Framework для Amazon SWF » Amazon сообщает, что у них есть образец кода для crons:
... > Задания Cron В этом примере длительный рабочий процесс периодически выполняет действие. Демонстрируется возможность продолжать выполнение как новое выполнение, так что выполнение может выполняться в течение очень продолжительных периодов времени. ...
Я загрузил AWS SDK для Java ( http://aws.amazon.com/sdkforjava/ ) и, конечно же, похоронил в нелепых слоях папок есть некоторый код java ( aws-java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
).
Проблема в том, если честно, это не совсем помогает, потому что я не могу легко переварить это с моим набором навыков. Тот же образец отсутствует в PHP SDK, и, похоже, нет учебника, который бы прошел через этот процесс. В общем, я все еще ищу совет или подсказку.