#ruby-on-rails #capistrano #unicorn #sidekiq
#ruby-на-рельсах #капистрано #единорог #sidekiq
Вопрос:
Каков наилучший способ управления несколькими взаимосвязанными службами для веб-приложений, таких как:
- сервер rails / unicorn / puma
- redis / sidekiq / resque
Так что, если один из них остановлен или запущен, другие тоже будут остановлены / запущены.
Ответ №1:
Обычно для этой цели используется инструмент мониторинга. Одним из таких хороших инструментов является Бог.
Основная идея состоит в том, чтобы запускаться God
как системная служба и настраивать вас sidekiq
так, чтобы за вами наблюдал Бог. Когда ваш сервер перезапускается, God запускается как сервис, и он запускает ваших sidekiq
работников.
Вы получаете больше преимуществ, используя Бога, и это лишь некоторые из них:
- уведомления: вы можете настроить его так, чтобы он отправлял вам уведомления, когда ваш работник sidekiq умирает и перезапускается.
- мониторинг ресурсов: вы можете настроить его на выполнение действий на основе предопределенных правил. Например, перезапустите задание, когда оно потребляет слишком много памяти.
Обновление: только что прочитал сегодня утром статью, которая может быть очень полезной: создавайте, запускайте и управляйте фоновыми процессами Ruby с помощью upstart.
Комментарии:
1. Очень услужливый Джеймс. Я прочитал много блогов о Боге, выскочке и Моните. Я нахожу, что люди больше жалуются на Бога (то есть на утечки памяти) и предпочитают Monit, хотя God выглядит простым и более адаптируемым для разработчиков Rails.
2. Мой процесс Sidekiq также занимает огромную память (500-800 МБ). Я обнаружил, что некоторые другие разработчики также жалуются на это. Похоже, что программы ruby подвержены утечке памяти. А ты как думаешь?
3. Приложения Ghazi, ruby и rails легко занимают много памяти, но это не обязательно связано с утечкой. Например, если в вашем Sidekiq worker загружается огромное количество объектов activerecord, это может привести к потере памяти. Сложно отлаживать такие проблемы и настраивать ruby GC, но это просто реальность. Возможно, вы захотите, чтобы каждый работник был маленьким и быстрым. Если рабочему действительно нужно работать с большим количеством объектов AR, тщательно настройте запросы и логику (например, используйте
find_each
для пакетной загрузки объектов db для экономии памяти).