Запуск отложенных заданий на Heroku бесплатно

Можно ли запускать отложенные задания на Heroku бесплатно?

Я пытаюсь использовать delayed_job_active_record на Heroku. Однако для этого требуется worker dyno, и это стоило бы денег, если бы я включил этот dyno в течение полного времени.

Я подумал, что использовать Unicorn и заставить своих рабочих выполнять отложенные задания вместо рабочего Heroku, ничего не будет стоить, одновременно успешно выполняя все задания. Однако рабочие Unicorn, похоже, не начинают "работать" автоматически.

У меня есть следующее в моем Procfile.

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker: bundle exec rake jobs:work

и следующее в моем unicorn.rb

worker_processes 3
timeout 30
preload_app true

before_fork do |server, worker|
  # Replace with MongoDB or whatever
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.connection.disconnect!
    Rails.logger.info('Disconnected from ActiveRecord')
  end

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis.quit
    Rails.logger.info('Disconnected from Redis')
  end

  sleep 1
end

after_fork do |server, worker|
  # Replace with MongoDB or whatever
  if defined?(ActiveRecord::Base)
    ActiveRecord::Base.establish_connection
    Rails.logger.info('Connected to ActiveRecord')
  end

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis = ENV['REDIS_URI']
    Rails.logger.info('Connected to Redis')
  end
end

Замедленные задания, похоже, работают, когда я масштабирую работника Heroku от 0 до 1. Опять же, невозможно ли использовать рабочих Unicorn вместо рабочего Heroku для выполнения отложенных заданий?

Нужно ли использовать драгоценный камень, например workless, для запуска отложенных заданий на Heroku бесплатно? (ссылка)

Ответ 1

Разделение процесса, подобного этому, может повлечь за собой проблемы - лучше всего это не попробовать и получить его "бесплатно", а использовать что-то вроде http://hirefireapp.com/, которое запустится работник, когда есть задания для сокращения стоимости, а не для запуска рабочего 24x7.

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

Ответ 2

В идеале нет прямого способа получить это бесплатно, но вы найдете много обходного решения, которое можно сделать, чтобы получить бесплатные фоновые задания. Один из них http://nofail.de/2011/07/heroku-cedar-background-jobs-for-free/

Также, если вы планируете использовать resque, который является отличным выбором для фоновых заданий, вам понадобится redis, который поставляется бесплатно с nano version = > https://addons.heroku.com/redistogo. https://devcenter.heroku.com/articles/queuing-ruby-resque

Простым решением является покупка одного диноза для рабочего, тогда как ваш веб-дино будет бесплатным.

Позвольте мне, если вам нужна дополнительная помощь.

Спасибо

Ответ 3

Вы можете использовать Heroku Scheduler для запуска заданий с помощью команды

rake jobs:workoff

Таким образом, задания могут выполняться в вашем веб-dyno. Согласно Delayed_Job docs, эта команда будет запускать все доступные задания и выйти.

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

Ответ 5

Если у вас есть только один веб-рабочий, Heroku будет спать, если он неактивен в течение часа.

Кроме того, Heroku перезагрузит все динозасы не реже одного раза в день.

Это затрудняет работу с планировщиком внутри Ruby. Он должен, по крайней мере, использовать постоянное хранилище (например, базу данных).