1

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

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

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

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

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

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

+1

дайте мне знать, если вы найдете что-нибудь, это действительно здорово, и я мог бы использовать что-то подобное. Спасибо за сообщение –

ответ

0

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

Это использует Hirefire взять работник дино вниз, когда очередь пуста, и использует heroku-api Gem поговорить с Героку.

Инициализаторы/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. Например, нет необходимости контролировать приложение с 10 вечера до 6 утра.