Cron на AWS (или распределенные системы вообще)

Я удивлен, что не смог найти больше об этом, но, увы, я до сих пор не могу найти ответ. Недавно мы перешли на AWS, переместив наш простой веб-сайт на более надежную и надежную систему. В настоящее время меня сбивает с толку управление заданиями cron в распределенной системе, когда это задание cron передается каждому экземпляру в среде.

Вот вариант использования:

Фон

Настройка

Мы используем традиционный стек LAMP. Вероятно, первая проблема, но это то, что мы получили.

Таблицы БД

table1

 - id int(11)
 - start date
 - interval int(11) (number of seconds)

table2

 - id int(11)
 - table1_id int(11)
 - sent datetime

Цель

Цель состоит в том, чтобы скрипт запускался один раз в день и проверял следующее:

  1. Текущая дата прошлаtable1.start
  2. table1.start< текущая дата
  3. table1.interval> 0
  4. сегодня ровно целый интервал (, так что будет ошибка, если интервал будет 7 дней [в секундах], и это 6-й день)
  5. в table2нет такой записи, что table2.sentсоответствует сегодняшнему дню, а table2.table1_idсоответствует предыдущим проверкам.

Если все эти проверки пройдены, мы вставляем запись в таблицу2 для каждой таблицы1, имеющей интервал. Это также означает, что мы отправляем электронное письмо на основе данных в таблице 2.

Проблема

По сути, у нас есть два запроса, представленных вышеупомянутыми блоками. Проблема в том, что в распределенной системекаждый экземпляр будет запускать cron одновременно (или с разницей в миллисекунды ). Понятия «транзакция» не существует, поэтому каждый экземпляр отправит электронное письмо, если один из них не успеет вставить в table2до того, как другие выполнят первый запрос.

Решения???

Я провел довольно много исследований по этому вопросу, но единственные потенциальные решения, которые я придумал, подробно описаны ниже :

. Экземпляр Cron

Настройте один независимый экземпляр, отвечающий за выполнение заданий cron. Хотя это, безусловно, (насколько я вижу )будет работать, это очень затратно для работы, которая не очень дорогая и должна выполняться не более одного раза в день.

Планировщик PHP

Установите cron для регулярного запуска скрипта PHP, который действует как планировщик. Это был путь, по которому мы пошли после того, как исследования показали, что он будет самым простым для нашего ограниченного времени и денег. Проблема, с которой я столкнулся, заключалась в том, что это просто сместило проблему параллелизма с потребления заданий на планирование заданий. Когда вы планируете задания таким образом, чтобы несколько заданий не планировались одновременно с каждого экземпляра, на котором запущен cron?

Этот метод также кажется очень "неуклюжим" (, если заимствовать любимое слово моего друга ), и я должен согласиться.

Транзакции

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

Наконец

Так что, если кто-то может помочь мне разобраться в этом, я был бы очень признателен. Возможно, мои навыки гугления заржавели, но я не могу представить, что я единственный, кто страдает от этой (вероятно простой )задачи.

7
задан kingjeffrey 1 February 2013 в 01:20
поделиться