Resque, redis, bluepill, background job à la queue pour rails

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:

https://github.com/defunkt/resque