Как мне управлять работниками Heroku для нечастых заданий

Я работаю над приложением (развернутым в Heroku), которое разделено на общедоступный и административный разделы. Одной из основных задач в разделе администратора (управляемом несколькими пользователями) является загрузка изображений. Эти изображения могут быть очень большими и должны быть обработаны до нескольких размеров (некоторые очень большие). Я обрабатываю загрузку изображения на стороне клиента, загружаю его непосредственно на S3, а затем обрабатываю обработку изображения с помощью Sidekiq. Это позволяет избежать блокировки веб-дино и проблем с тайм-аутами Unicorn.

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

Итак, я ищу решение, которое делает следующее:

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

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

Какие у меня есть варианты?


person Undistraction    schedule 01.12.2014    source источник
comment
дайте мне знать, если вы найдете что-нибудь, это кажется действительно крутым, и я мог бы использовать что-то подобное. Спасибо за публикацию   -  person    schedule 01.12.2014


Ответы (1)


Надеюсь, кто-то сможет снять это и предложить лучший подход, но вот простая попытка:

Это использует Hirefire, чтобы отключить рабочий динамометр, когда очередь пуста, и использует heroku-api Gem, чтобы поговорить с Heroku.

инициализаторы/heroku.rb

require 'heroku-api'

if Rails.env.production? || Rails.env.staging?
  Rails.application.config.heroku = Heroku::API.new(api_key: ENV['HEROKU_API_KEY'])
end

приложение/услуги/heroku_service.rb

require 'heroku-api'

class HerokuService

  def self.ensureWorker
    if Rails.application.config.respond_to? :heroku
      # spawn a worker if needed
      Rails.application.config.heroku.post_ps_scale(ENV['HEROKU_APP_NAME'], 'worker', 1)
    end
  end

end

Очевидно, что вызов API-интерфейса Heroku блокируется, и динамометру требуется некоторое время, чтобы раскрутиться, но это намного быстрее, чем полагаться только на HireFire. Мне интересно, может ли использование планировщика для создания одноразовых динамометров, которые проверяют очередь через равные промежутки времени, быть предпочтительнее, чем использование Hirefire. Например, не будет необходимости контролировать приложение с 22:00 до 6:00.

person Undistraction    schedule 01.12.2014