Лучшее решение для рельсов, которое работает каждую минуту

У меня есть приложение, которое каждую минуту проверяет базу данных на наличие писем, которые должны быть отправлены в это время. Я думал о том, чтобы сделать эту задачу граблями, которая будет выполняться заданием cron каждую минуту. Будет ли лучшее решение для этого?

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

Мысли?

Благодарю.

4 ответа

Решение
  1. Ты можешь использовать backgroundrb, Это, однако, израсходует память из вашего основного приложения на Rails, так как будет порождать один экземпляр Ruby исключительно для backgroundrb,
  2. Вы также можете определить SystemController (или эквивалент) в вашем основном приложении, с различными действиями, соответствующими различным домашним задачам, которые ваше приложение должно выполнить. Вы можете "подтолкнуть" его от crontab с помощью wget или же curl преимущество в том, что он разделяет ресурсы с вашим основным приложением. В зависимости от того, насколько вы параноидальны, или насколько вы уязвимы для DOS (или других типов атак), подвергающих такой контроллер, возможно, внешнему миру, вы можете заблокировать доступ к URL этого контроллера с адресов, отличных от обратной петли (в идеале в вашем обратном прокси-сервере, или из самого контроллера.)

Оказывается, на самом деле что-то создано для этого: ar_mailer. ar_mailer помещает электронные письма в базу данных, а затем периодически отправляет их с помощью команды ar_mailer. Вы можете вызывать ar_mailer каждую минуту.

Хорошая вещь в ar_mailer заключается в том, что он требует очень мало изменений в том, как вы уже отправляете электронные письма. Вам просто нужно наследовать от ar_mailer вместо ActiveMailer. Используя этот метод, вам не нужно будет беспокоиться о запуске задач rake в фоновом режиме, о разветвлении процессов или о чем-либо подобном - и в результате вы получите настоящий почтовый сервер с сообщениями в очереди, которые удаляются при отправке почты. Эта функция важна, если у вас есть система, которая отправляет большое количество электронных писем. Я использовал ar_mailer для создания социальной сети, поэтому я могу подтвердить ее надежность.

Вот хорошая статья, которая подробно рассказывает об ar_mailer. Я бы настоятельно рекомендовал не использовать здесь собственное решение, так как Эрик создал проверенное временем решение этой самой проблемы.

Одним из действительно простых методов будет иметь скрипт, который делает..

while true do
    check_and_send_messages()
    sleep 60
end

... что означает, что вы не постоянно вызываете среду Rails.

Очевидно, что он имеет различные недостатки, но также имеет некоторые преимущества (например, если вы выполняете 1 Rake-per-минута, если задача Rake занимает более одной минуты, Rake будет запускаться несколько раз одновременно)

Кроме того, эпизоды Railscasts Rake in Background, Starling и Workling и Custom Daemon могут дать вам некоторые идеи (они описывают именно эту задачу)

Я делаю то, что предложил Влад (#2), с учетом только локальных запросов, и я настолько параноидален, что мне также требуется конкретная строка запроса, привязанная к URL.

У меня есть несколько периодических действий, настроенных таким образом.

Другие вопросы по тегам