ruby on rails - rails - Ejecutar trabajos retrasados en Heroku gratis
run migrations heroku rails (5)
¿Es posible ejecutar trabajos retrasados en Heroku gratis?
Estoy tratando de usar delayed_job_active_record
en Heroku. Sin embargo, requiere un worker dyno
y costaría dinero si activara este dinamómetro por tiempo completo.
Pensé que usar Unicorn y hacer que sus trabajadores ejecutaran trabajos retrasados en lugar del trabajador de Heroku, no costaría nada, mientras ejecutaba con éxito todos los trabajos. Sin embargo, los trabajadores de Unicornio no parecen comenzar a "trabajar" automáticamente.
Tengo lo siguiente en mi Procfile .
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker: bundle exec rake jobs:work
y lo siguiente en mi unicornio.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
Los trabajos retrasados solo parecen funcionar cuando escalo el trabajador de Heroku de 0 a 1. De nuevo, ¿no es posible usar trabajadores de Unicorn en lugar de trabajadores de Heroku para hacer los trabajos retrasados?
¿Tengo que usar una gema como sin workless
para ejecutar trabajos retrasados en Heroku gratis? ( referencia )
Dividir el proceso de esa manera puede ocasionar problemas: su mejor opción es no intentar obtenerlo ''gratis'', sino usar algo como http://hirefireapp.com/, que pondrá en marcha a un trabajador cuando haya trabajos para reducir el costo significativamente. en lugar de ejecutar un trabajador 24x7.
También tenga en cuenta que Heroku solo iniciará automáticamente un proceso ''web'' para usted, iniciar otros procesos nombrados es una tarea manual.
Idealmente, no hay una forma directa de obtener esto gratis, pero encontrará muchas soluciones que puede hacer para disfrutar de trabajos de fondo gratuitos. Uno de los cuales es http://nofail.de/2011/07/heroku-cedar-background-jobs-for-free/
Además, si planea usar resque, que es una excelente opción para trabajos en segundo plano, necesitaría redis que viene gratis con la versión nano => https://addons.heroku.com/redistogo . https://devcenter.heroku.com/articles/queuing-ruby-resque
La solución simple es comprar un dinamómetro para el trabajador, mientras que su dinamómetro web sería gratis.
Déjame si necesitas más ayuda.
Gracias
Si solo tienes un trabajador web, Heroku lo dormirá si está inactivo durante una hora.
Además, Heroku reiniciará todos los dinnos al menos una vez al día.
Esto hace que sea difícil hacer un planificador dentro de ruby. Tiene que al menos usar almacenamiento persistente (por ejemplo, base de datos).
Considere usar la gema Workless: https://github.com/lostboy/workless
Puede usar el programador Heroku para ejecutar los trabajos usando el comando
rake jobs:workoff
De esta forma, los trabajos pueden ejecutarse en su dyno web. De acuerdo con Delayed_Job docs , este comando ejecutará todos los trabajos disponibles y saldrá.
Puede configurar el planificador para ejecutar este comando cada 10 minutos, por ejemplo, y no tiene un efecto sensible en el rendimiento de la aplicación cuando no hay trabajos en cola. Otra buena idea es programar que se ejecute diariamente a la vez con tasas de acceso más bajas.