Rails: Могу ли я запускать фоновые задания на другом сервере?
Можно ли разместить приложение на одном сервере и поставить в очередь задания на другом сервере?
Возможные примеры:
Два разных экземпляра EC2, один с главным сервером, а второй со службой очередей.
Разместите приложение в Heroku и используйте экземпляр EC2 со службой очередей.
Это возможно?
Спасибо
2 ответа
Определенно да. Мы создали delayed_job таким образом, чтобы я работал.
Есть несколько требований, чтобы он работал:
- Серверы должны иметь синхронизированные часы. Обычно это не проблема, если все часовые пояса сервера установлены одинаково.
- Все серверы должны иметь доступ к одной и той же базе данных.
Для этого у вас есть одно и то же приложение на обоих (или на всех, если их более двух) серверах, и вы запускаете рабочие на любом сервере, который хотите обрабатывать. Любой сервер все еще может ставить в очередь задания, но только один из них с работающими работниками будет фактически обрабатывать их.
Например, у нас есть один interface
сервер, db
сервер и несколько worker
сервера. interface
сервер обслуживает приложение через Apache/Passenger, соединяя приложение Rails с db
сервер. workers
У вас есть такое же приложение, хотя Apache не работает, и вы не можете получить доступ к приложению через http. С другой стороны, у них есть работающие delayed_job s. В общем сценарии interface
сервер ставит в очередь задания в db
и worker
серверы обрабатывают их.
Одно слово предостережения: если вы полагаетесь на физические файлы в вашем приложении (вложения, файлы журналов, загруженный XML или что-либо еще), вам, скорее всего, понадобится решение, подобное S3, для хранения этих файлов. Причина этого заключается в том, что отдельные серверы могут не иметь фактических файлов. Примером этого является то, что если ваш пользователь должен загрузить свое изображение профиля на ваш веб-сервер, файлы, скорее всего, будут храниться на этом сервере. Если у вас есть другой сервер для изменения размера изображений профиля, изображение не будет существовать на рабочем сервере.
Просто чтобы предложить другой жизнеспособный вариант: вы можете использовать новый рабочий сервис, такой как IronWorker, который полностью полагается на гибкую ферму облачных серверов внутри EC2.
Таким образом, вы можете ставить в очередь / планировать выполнение заданий, и они будут распараллеливаться между тоннами потоков, охватывающих несколько серверов, и все это без заботы об инфраструктуре.
То же самое относится и к базе данных - она должна быть доступна извне.
Полное раскрытие: я помог построить IW.