2011-01-07 1 views
4

Возможно ли размещать приложение на одном сервере и выполнять задания очереди на другом сервере?Rails: Могу ли я запускать задания фона на другом сервере?

Возможные примеры:

  1. Два разных экземпляров EC2, один с главным сервером, а второй с услугой массового обслуживания.

  2. Хост приложение в Heroku и использовать экземпляр EC2 с сервисом массового обслуживания

Возможно ли это?

Thanks

ответ

13

Да, определенно. Мы создали delayed_job таким образом, где я работаю.

Есть несколько требований для его работы:

  1. серверы должны иметь синхронизированные часы. Как правило, это не проблема, так как серверные временные интервалы настроены одинаково.
  2. Все серверы должны иметь доступ к одной и той же базе данных.

Для этого вы просто используете одно и то же приложение на обоих (или всех, если более двух) серверах и начинаете работу с сервером, на котором вы хотите обрабатывать задания. Любой сервер может все еще стоять в очереди, но только тот, кто работает с рабочими, фактически обработает их.

Например, у нас есть один сервер interface, сервер db и несколько серверов worker. Сервер interface обслуживает приложение через Apache/Passenger, подключая приложение Rails к серверу db. workers имеют одно и то же приложение, хотя Apache не работает, и вы не можете получить доступ к приложению через http. С другой стороны, у них есть работники delayed_jobs. В общем случае сервер interface останавливает задания в db, а серверы worker обрабатывают их.

Одно слово предостережения: если вы полагаетесь на физические файлы в своем приложении (вложения, файлы журналов, загруженные XML или что-то еще), вам, скорее всего, потребуется такое решение, как S3, для хранения этих файлов. Причина этого в том, что на отдельных серверах могут отсутствовать фактические файлы. Примером этого является то, что ваш пользователь должен был загружать свое изображение профиля на свой веб-сервер, файлы, вероятно, будут храниться на этом сервере. Если у вас есть другой сервер для изменения размера изображений профиля, изображение не будет существовать на рабочем сервере.

+0

Спасибо за ответ. Теперь я понимаю, как это сделать, используя собственные серверы. Есть ли способ сделать это с помощью Heroku + My server? – donald

+0

Это действительно зависит от того, разрешает ли Heroku прямой доступ к своим базам данных с внешних серверов. Я не думаю, что они делают, поэтому ответ будет «нет». – vonconrad

+0

как насчет 'mount'? разве это не надежное решение? – mdesantis

5

Просто для того, чтобы предложить еще один жизнеспособный вариант: вы можете использовать новый рабочий сервис, такой как IronWorker, который полностью полагается на эластичную ферму облачных серверов внутри EC2.

Таким образом, вы можете запускать очереди/планировать задания, и они будут распараллеливаться через множество потоков, охватывающих несколько серверов, - все, не беспокоясь об инфраструктуре.

Такая же сделка с базой данных - она ​​должна быть доступна извне.

Полное раскрытие информации: Я помог построить IW.