run rails migrations asset ruby-on-rails heroku delayed-job

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).



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.