Лучшее решение для рельсов, которое работает каждую минуту - PullRequest
6 голосов
/ 18 марта 2009

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

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

Мысли

Спасибо.

Ответы [ 4 ]

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

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

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

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

1 голос
/ 21 марта 2009

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

while true do
    check_and_send_messages()
    sleep 60
end

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

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

Кроме того, эпизоды Railscasts Грабли в фоновом режиме , Скворец и Ворлинг и Пользовательский демон могут дать вам некоторые идеи (они описывают именно эту задачу)

0 голосов
/ 21 марта 2009

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

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

...