Репликация средства очереди задач AppEngine на EC2 / Elastic Beanstalk - PullRequest
5 голосов
/ 25 марта 2011

Я подумываю о переходе с AppEngine на EC2 / Elastic Beanstalk, так как мне нужны мои серверы, расположенные в пределах ЕС [AppEngine не предлагает опцию определения местоположения сервера AFAIK]. Я запустил пример приложения Elastic Beanstalk, и это хорошо; однако одной из функций AppEngine, на которую я в значительной степени полагаюсь, является функция автономных очередей задач / cron, поскольку я периодически получаю много данных с других сайтов. Мне интересно, что мне нужно было бы настроить в Elastic Beanstalk / EC2 для репликации этого средства очереди задач, есть ли еще какие-либо рекомендации, сколько потребуется работы и т. Д.

Спасибо!

Ответы [ 2 ]

1 голос
/ 06 июля 2011

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

Как я это реализую, выглядит так:

  1. Упакуйте задание cron "config file" с WAR.Этот файл должен содержать частоты и URL-адреса (поскольку каждый действительный cron является просто вызовом определенного URL-адреса, как это делает AE)
  2. Использовать одну таблицу базы данных для поддержания координации.Требуется как минимум два столбца.
    1. первичный или уникальный ключ, который (строка) содержит команду вместе с ее частотой.(например, "@daily http://your -app / some / cron / handler / url ")
    2. второй столбец, который содержит время последнего выполнения.

каждый экземпляр tomcat будет запускать поток cron, который должен считывать конфигурацию из WAR и планировать свой режим ожидания столько времени, сколько потребуется до следующего вызова службы.как только время истекает, экземпляр должен сначала попытаться «потребовать» вызов, сначала выбрав из базы данных время последнего вызова этой команды, а затем обновив его, чтобы получить «блокировку».

  1. query(SELECT last_execution_time FROM crontable WHERE command = ?)
  2. if(NOW() - last_execution_time < reasonable window) skip;
  3. query(UPDATE crontable SET last_execution_time = NOW() WHERE command = ? AND last_execution_time = ?)
  4. if(number of rows updated == 0) skip;
  5. run task()

Ключевым элементом здесь является то, что мы также включаем last_execution_time в предложение WHERE, гарантируя, что, если какой-то другой экземпляр обновит его между нашими SELECT и UPDATE, обновление вернет, что строки не были затронуты иэтот экземпляр пропустит выполнение этой задачи.

0 голосов
/ 28 марта 2011

Если вы перемещаете свое приложение, вам, вероятно, лучше просто использовать TyphoonAE или AppScale . Оба являются альтернативными средами, в которых вы можете запускать приложение App Engine без изменений, и оба поддерживают EC2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...