Подтвердить что ты не робот

Запуск отложенных заданий на 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 бесплатно? (ссылка)

4b9b3361

Ответ 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. Он должен, по крайней мере, использовать постоянное хранилище (например, базу данных).