Resque, Redis et bluepill pour rails2.X ou 3
Resque permet de mettre des backgrounds jobs dans des queues dans rails.
https://github.com/defunkt/resque
Redis est une base de données Clé / Valeur (key/value store) très performante utilisée par Resque.
https://github.com/ezmobius/redis-rb
Bluepill permet de monitorer les processus.
https://github.com/arya/bluepill
Installation
Installation de Resque
sudo gem install resque
Installation de bluepill
sudo gem install bluepill
Installation de Redis
git clone git://github.com/defunkt/resque.git
cd resque
rake redis:install dtach:install
rake redis:start
Configuration
Créer un fichier dans config/intializer/resque.rb avec
class Authentication def initialize(app) @app = app end def call(env) env['warden'].authenticate!(:database_authenticatable, :rememberable, :scope => :admin) @app.call(env) end end Resque::Server.use Authentication
Ensuite il faut que l'application rails charge les rake tasks de resque, il faut donc ajouter au fichier Rakefile du projet rails :
require 'resque/tasks'
Puis un fichier de config pour bluepill config/development.pill (pour qu'il sache quel processus monitorer) !
Bluepill.application("monappli") do |app| # Redis app.process("redis") do |process| process.start_command = "redis-server /etc/redis.conf" process.daemonize = true process.pid_file = "/tmp/redis.pid" process.start_grace_time = 3.seconds process.stop_grace_time = 5.seconds process.restart_grace_time = 8.seconds process.stop_command = "echo 'SHUTDOWN' | nc localhost 6379" end # Workers ["maqueue1", "maqueue2"].each do |worker_type| app.process(worker_type+"_worker") do |process| process.group = "workers" process.start_command = "cd /mnt/dev/rails/monappli; QUEUE="+worker_type+" rake environment resque:work RAILS_ENV=development" process.daemonize = true process.pid_file = "/tmp/"+worker_type+"_worker.pid" process.start_grace_time = 3.seconds process.stop_grace_time = 5.seconds process.restart_grace_time = 8.seconds process.stop_command = "resque killall" end end # Resque-web | UI pour voir l'état des queues app.process("resque-web") do |process| process.start_command = "resque-web -p 3010" process.daemonize = true process.pid_file = "/tmp/resque-web.pid" process.start_grace_time = 3.seconds process.stop_grace_time = 5.seconds process.restart_grace_time = 8.seconds end end
Comme ça bluepill sait qu'il doit démarrer les workers, redis, et resque-web (ce dernier vous permet de voir les jobs, les queues et tout et tout) Pour tout démarrer :
sudo bluepill load /mnt/dev/rails/monappli/config/development.pill
Dans votre application rails : créer un model dans le fichier maqueue_jobs.rb avec ce code de base :
class MaqueueJobs # On peut choisir de mettre plusieurs worker par queue # le symbole est le nom de la queue @queue = :maqueue1 def self.perform(params1, params2, params3, ...) #Code que va executer le worker #C'est ici que l'on mets le code lourd et long qui doit s'effectuer en background end end
Dans votre application rails pour lancer en queue :
Resque.enqueue(Maqueue, params1, params2, params3, ...)Attention params1 params2 params3 ne doivent pas être des models instanciés, passez les id des models
Vous pouvez constater sur https://localhost:3010/stats/resque l'état de vos queues, workers, et les jobs en attentes (pending) et vos jobs terminés (processed)
Pour plus d'info le readme officiel: