Ruby / Rails - лучший способ выполнения задач после развертывания?

Мы размещаем наше приложение Ruby on Rails в EngineYard App Cloud, которое нам очень понравилось. Они предоставляют серию обратных вызовов развертывания (before_restart, after_restart и т. Д.), Которые аналогичны обратным вызовам Capistrano.

В нашем приложении есть ряд задач Rake, которые обслуживают различные части приложения. Если мы добавим новое бизнес-правило в базу данных, нам может потребоваться перезагрузить связанные бизнес-правила пользователей и т. Д.

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

Существуют ли какие-либо системы, которые позволили бы нам определить задачу, которая будет запускаться при следующем развертывании, что-то вроде миграции. Идеальная система, на мой взгляд, работала бы следующим образом:

  • Мы понимаем, что при следующем развертывании нужно будет запустить задачу.
  • Планируем задачу через систему
  • При следующем развертывании система видит список задач после развертывания - она ​​замечает, что самая последняя из них еще не была запущена на определенном сервере (например, как миграция записывает базу данных при запуске, так что только запускаются самые последние невыполненные миграции) - запускается новая задача

Есть ли какие-либо рекомендации по наилучшим методам планирования этих задач после развертывания и их запуску, если они еще не были запущены на сервере?

Спасибо!


person shedd    schedule 08.09.2010    source источник


Ответы (2)


На ум приходят два подхода

  1. Быстрое / грязное решение ... не могли бы вы просто использовать миграции для этого? Создайте миграцию Rails, которая запускает задачи при запуске rake db: migrate
  2. Используйте тот же подход, что и при миграции. Создайте одноранговую таблицу для таблицы schema_migrations, а затем в своем before_symlink.rb (или где-то еще) запустите задачи, которые еще не были выполнены, а затем обновите таблицу?
person Rob Di Marco    schedule 08.09.2010
comment
Спасибо, Роб. Приятно найти вас на Stack Overflow. В этом ответе предполагается, что использование миграции может быть лучшим вариантом (stackoverflow.com/questions/3671471), хотя это кажется немного грязным. Вы когда-нибудь видели, чтобы функциональность, похожая на миграцию, использовалась для чего-либо, кроме БД? Мне нравится, как это звучит ... - person shedd; 09.09.2010
comment
Я никогда не видел, чтобы это делалось таким образом. Это действительно кажется практичным, но я всегда сомневаюсь, чтобы что-то делало что-то такое, чего не ожидала бы независимая третья сторона. Я, наверное, слишком усложняю это. - person Rob Di Marco; 09.09.2010

Попробуйте рубиновый гем after_party, который смоделирован на основе базовой операции db: migrate, но предназначен для задач после развертывания. . Задачи после развертывания (rake) создаются с таким именем

lib / tasks / deployment / 20130130215258_task_name.rake

Конечно, вы можете вызвать любой код Ruby из задачи rake. В документации говорится, что он поддерживает синхронизирующие и асинхронные задачи (асинхронные задачи - это длительные задачи, которые вы можете выполнять в фоновом режиме, пока ваше приложение запускается).

Я не использовал его, но собираюсь попробовать, поскольку у нас есть те же требования, что и вы описали.

person Clayton Bell    schedule 14.05.2014
comment
Это выглядит красиво - звучит так, как будто это действительно подошло бы. Спасибо, что разместили это, я буду помнить об этом в будущем. - person shedd; 15.05.2014