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

Можно ли разместить приложение на одном сервере и поставить в очередь задания на другом сервере?

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

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

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

Это возможно?

Спасибо

2 ответа

Решение

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

Есть несколько требований, чтобы он работал:

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

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

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

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

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

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

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

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

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