2015-03-20 2 views
3

В нашем Rails-приложении есть очень интенсивные фоновые процессы, иногда требуется несколько часов для запуска. Мы используем delayed_job, и рассмотрим переход к Resque или бесплатную версию Sidekiq, в этом контексте этот вопрос имеет смысл.Как управлять пулом фоновых серверов в Rails

Мы выполняем 100% -ный процессор на всех процессорах для некоторых заданий, а в настоящее время фоновые процессоры находятся на одном физическом сервере, таком как Nginx, Rails и Postgres. Мы также ожидаем роста нагрузки.

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

Что я не уверен в том, как это кодировать, а также как балансировать нагрузки очередей заданий на разных виртуальных машинах. Это что-то, что может сделать delayed_job/Reqsue/Sidekiq, или мне нужно его закодировать?

EDIT

Некоторые полезные ссылки, которые я нашел на эту тему

http://www.slideshare.net/kigster/12step-program-for-scaling-web-applications-on-postgresql

Use multiple Redis servers in Sidekiq

https://stackoverflow.com/a/19540427/993592

+1

Проверьте это https://github.com/railsmachine/moonshine, он обеспечивает простой способ управления кластером и построили в плагине для управления Resque кластера с богом (http://godrb.com/) –

ответ

1

Мои личные предпочтения Sidekiq. Я был бы немного обеспокоен работой «нескольких часов», и что произойдет, если они потерпят неудачу посередине. По умолчанию Sidekiq попытается перезапустить их. Вы можете изменить это, но вы определенно хотите продумать сценарий. Это, конечно же, будет верно для любой фоновой системы обработки работы, которую вы используете. ИМХО Я бы попытался найти способ разбить эти большие рабочие места на более мелкие рабочие места. Даже если это всего лишь «рабочая часть 1, затем завершает работу с частью 2 и т. Д.».

Что касается масштабируемости Единственный реальный предел Sidekiq - это Redis. См. Здесь некоторые варианты: https://github.com/mperham/sidekiq/wiki/Sharding

Что касается балансировки нагрузки, Sidekiq делает это по умолчанию. Теперь я запускаю два сервера sidekiq, которые вытягивают из одного экземпляра Redis. 25 рабочих на каждой с примерно 12 очередями. Работает удивительно хорошо.

+0

Благодарим вас за ответ.Означает ли это, что приложение Rails установлено на всех трех серверах? – ardochhigh

+1

Да. Я полагаю, вам не придется, если вы разложите все правильно, но я это сделаю. –

+0

Есть ли какие-нибудь справочники о том, как это сделать? Я имею в виду, если у нас есть центральная база данных и копии сервера Rails на нескольких ящиках, как они знают друг о друге? – ardochhigh

1

Я видел, как работники Sidekiq висят во время сетевых операций, в конечном итоге прекращая работу всех рабочих мест, не зная, пока пользователи не пожалуются.

ConeyIsland предлагает больше контроля над выполнением задания, чем Sidekiq, а также использует RabbitMQ для шины сообщений, которая является более надежной и имеет гораздо более широкие возможности масштабирования для Redis.

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

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

http://edraut.github.io/coney_island/

 Смежные вопросы

  • Нет связанных вопросов^_^