Я удивлен, что не смог найти больше об этом, но, увы, я до сих пор не могу найти ответ. Недавно мы перешли на 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
Цель состоит в том, чтобы скрипт запускался один раз в день и проверял следующее:
table1.start
table1.start
< текущая датаtable1.interval
> 0table2
нет такой записи, что table2.sent
соответствует сегодняшнему дню, а table2.table1_id
соответствует предыдущим проверкам.Если все эти проверки пройдены, мы вставляем запись в таблицу2 для каждой таблицы1, имеющей интервал. Это также означает, что мы отправляем электронное письмо на основе данных в таблице 2.
По сути, у нас есть два запроса, представленных вышеупомянутыми блоками. Проблема в том, что в распределенной системекаждый экземпляр будет запускать cron одновременно (или с разницей в миллисекунды ). Понятия «транзакция» не существует, поэтому каждый экземпляр отправит электронное письмо, если один из них не успеет вставить в table2
до того, как другие выполнят первый запрос.
Я провел довольно много исследований по этому вопросу, но единственные потенциальные решения, которые я придумал, подробно описаны ниже :
Настройте один независимый экземпляр, отвечающий за выполнение заданий cron. Хотя это, безусловно, (насколько я вижу )будет работать, это очень затратно для работы, которая не очень дорогая и должна выполняться не более одного раза в день.
Установите cron для регулярного запуска скрипта PHP, который действует как планировщик. Это был путь, по которому мы пошли после того, как исследования показали, что он будет самым простым для нашего ограниченного времени и денег. Проблема, с которой я столкнулся, заключалась в том, что это просто сместило проблему параллелизма с потребления заданий на планирование заданий. Когда вы планируете задания таким образом, чтобы несколько заданий не планировались одновременно с каждого экземпляра, на котором запущен cron?
Этот метод также кажется очень "неуклюжим" (, если заимствовать любимое слово моего друга ), и я должен согласиться.
Хотя я довольно много исследовал этот вопрос, параллелизм всегда решался с помощью атомарных транзакций в базе данных, но, насколько я могу судить, с LAMP этого добиться непросто. Но, возможно, я ошибаюсь, и я был бы очень рад, если бы это было доказано.
Так что, если кто-то может помочь мне разобраться в этом, я был бы очень признателен. Возможно, мои навыки гугления заржавели, но я не могу представить, что я единственный, кто страдает от этой (вероятно простой )задачи.