2014-08-27 6 views
0

Я хотел бы увеличить/уменьшить масштаб моих динамиков, автоматически зависящих от размера ожидающего списка.Autoscaling Рабочие Resque на Heroku в реальном времени

Я слышал о HireFire, но масштабирование производится только каждую минуту, и мне нужно, чтобы оно было (почти) в режиме реального времени.

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

Я думал о том, чтобы сделать это сам (с планировщиком (~ 15 с) и с использованием API Heroku), потому что я не уверен, что там что-то есть; и если нет, знаете ли вы какие-либо инструменты мониторинга, которые могли бы отправить уведомление по электронной почте, если длина очереди превышает фиксированный размер? (аналогично apdex на newrelic).

ответ

1

Возможное решение для пользовательского кода приведено ниже. Есть также два новых реликвия Relic, которые выполняют Resque-мониторинг. Я не уверен, есть ли оповещения по электронной почте, основанные на превышении определенного размера очереди. Используя resque hooks, вы можете выводить сообщения журнала, которые могут запускать оповещения по электронной почте (или slack, hipchat, pagerduty и т. Д.) Через службу, например Papertrail или Loggly. Это может выглядеть примерно так:

def after_enqueue_pending_check(*args) 
    job_count = Resque.info[:pending].to_i 
    if job_count > PENDING_THRESHOLD 
    Rails.logger.warn('pending queue threshold exceeded') 
    end 
end 

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

Я не думаю, что есть дополнение Heroku или другое обслуживание, которое может выполнять масштабирование в реальном времени. Существует gem, который сделает это, используя устаревший API Heroku. Вы можете сделать это, используя resque hooks и Heroku platform-api. Этот непроверенный пример использует платформу heroku-api для масштабирования «рабочих» динамиков вверх и вниз. В качестве примера я включил 1 работника на каждые три ожидающие работы. Сокращение будет только каждый сброс рабочих до 1, если нет ожидающих рабочих мест и рабочих мест. Это не идеально и должно быть обновлено в соответствии с вашими потребностями. Смотрите здесь для получения информации об обеспечении того, чтобы затем сворачивают рабочих не потерять работу: http://quickleft.com/blog/heroku-s-cedar-stack-will-kill-your-resque-workers

require 'platform-api' 

def after_enqueue_upscale(*args) 
    heroku = PlatformAPI.connect_oauth('OAUTH_TOKEN') 
    worker_count = heroku.formation.info('app-name','worker')["quantity"] 
    job_count = Resque.info[:pending].to_i 
    # one worker for every 3 jobs (minimum of 1) 
    new_worker_count = ((job_count/3) + 1).to_i 
    return if new_worker_count <= worker_count 
    heroku.formation.update('app-name', 'worker', {"quantity" => new_worker_count}) 
end 

def after_perform_downscale 
    heroku = PlatformAPI.connect_oauth('OAUTH_TOKEN') 
    if Resque.info[:pending].to_i == 0 && Resque.info[:working].to_i == 0 
     heroku.formation.update('app-name', 'worker', {"quantity" => 1}) 
    end 
end 
+0

Thx, но я действительно не искал исходный код. Я ищу инструмент масштабирования или инструмент для мониторинга;) –

+0

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

0

Im имеющие похожую проблему и врезался в «Hirefire»

https://www.hirefire.io/.

Для рубина, используйте:

https://github.com/hirefire/hirefire-resource

Он работает аналогично теоретически работает как AdepScale (https://www.adeptscale.com/). Однако Hirefire также может масштабировать работников и не ограничивается только динамиками. Надеюсь это поможет!

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