Да, определенно. Мы создали delayed_job таким образом, где я работаю.
Есть несколько требований для его работы:
- серверы должны иметь синхронизированные часы. Как правило, это не проблема, так как серверные временные интервалы настроены одинаково.
- Все серверы должны иметь доступ к одной и той же базе данных.
Для этого вы просто используете одно и то же приложение на обоих (или всех, если более двух) серверах и начинаете работу с сервером, на котором вы хотите обрабатывать задания. Любой сервер может все еще стоять в очереди, но только тот, кто работает с рабочими, фактически обработает их.
Например, у нас есть один сервер interface
, сервер db
и несколько серверов worker
. Сервер interface
обслуживает приложение через Apache/Passenger, подключая приложение Rails к серверу db
. workers
имеют одно и то же приложение, хотя Apache не работает, и вы не можете получить доступ к приложению через http. С другой стороны, у них есть работники delayed_jobs. В общем случае сервер interface
останавливает задания в db
, а серверы worker
обрабатывают их.
Одно слово предостережения: если вы полагаетесь на физические файлы в своем приложении (вложения, файлы журналов, загруженные XML или что-то еще), вам, скорее всего, потребуется такое решение, как S3, для хранения этих файлов. Причина этого в том, что на отдельных серверах могут отсутствовать фактические файлы. Примером этого является то, что ваш пользователь должен был загружать свое изображение профиля на свой веб-сервер, файлы, вероятно, будут храниться на этом сервере. Если у вас есть другой сервер для изменения размера изображений профиля, изображение не будет существовать на рабочем сервере.
Спасибо за ответ. Теперь я понимаю, как это сделать, используя собственные серверы. Есть ли способ сделать это с помощью Heroku + My server? – donald
Это действительно зависит от того, разрешает ли Heroku прямой доступ к своим базам данных с внешних серверов. Я не думаю, что они делают, поэтому ответ будет «нет». – vonconrad
как насчет 'mount'? разве это не надежное решение? – mdesantis