rufus-scheduler e delayed_job no Heroku: por que usar um dinamômetro de trabalhador?
Estou desenvolvendo um aplicativo Rails 3.2.16 e implantando em uma conta de desenvolvedor Heroku com um dinamômetro da web gratuito e sem dynos de trabalho. Estou tentando determinar se é realmente necessário um dinamômetro (pago).
O aplicativo envia vários e-mails. Eu uso delayed_job_active_record para enfileirá-los e enviá-los.
Também preciso verificar uma contagem de notificações a cada minuto. Para isso, estou usando o rufus-scheduler.
O rufus-scheduler parece capaz de executar uma tarefa / thread em segundo planodentro um dinossauro da Web Heroku.
Por outro lado, tudo o que posso encontrar em delayed_job indica que ele requer um processo de trabalho separado. Por quê? Se o rufus-scheduler pode executar um daemon dentro de um dinamômetro da Web, por que o delayed_job não pode fazer o mesmo?
Eu testei o seguinte para executar minha tarefa a cada minutoe trabalhando em delayed_jobs, e parece funcionar no único dyno da Web Heroku:
config / inicializadores / rufus-scheduler.rb
require 'rufus-scheduler'
require 'delayed/command'
s = Rufus::Scheduler.singleton
s.every '1m', :overlap => false do # Every minute
Rails.logger.info ">> #{Time.now}: rufus-scheduler task started"
# Check for pending notifications and queue to delayed_job
User.send_pending_notifications
# work off delayed_jobs without a separate worker process
Delayed::Worker.new.work_off
end
Isso parece tão óbvio que estou me perguntando se estou perdendo alguma coisa. Essa é uma maneira aceitável de lidar com a fila delayed_job sem a complexidade e as despesas adicionais de um processo de trabalho separado?
Atualizar
Como o @jmettraux aponta, o Heroku inativa um dinamômetro da web inativo após uma hora. Ainda não o configurei, mas vamos assumir que estou usando um dos vários métodos keep-alive para impedir que ele durma:Maneira fácil de impedir que o Heroku fique ocioso?.