Configurer et créer un job qui tournera en arrière plan avec Sidekiq
<aside> ✅ Pré-requis
<aside> ⌛ Temps indicatif : 0.5J
</aside>
Raison :
La configuration minimum pour utiliser Sidekiq
# config/application.rb
class Application < Rails::Application
# ...
config.active_job.queue_adapter = :sidekiq
end
Raison :
L’interface permet de fournir en direct plusieurs informations :
# config/initializers/sidekiq.rb
require "sidekiq/web"
Sidekiq.configure_server do |config|
config.logger.level = Rails.logger.level
end
Sidekiq.default_job_options = { 'backtrace' => true }
# config/routes.rb
...
# il est possible de bloquer l'accès à l'interface Sidekiq
# via Devise comme l'exemple suivant
authenticate :compte, ->(c) { c.superadmin? } do
mount Sidekiq::Web => "/sidekiq"
end
app/jobs/*_job.rb
_job.rb
Job
Raison :
La convention Rails des jobs
# app/jobs/mon_super_job.rb
# frozen_string_literal: true
class MonSuperJob < ApplicationJob
queue_as :default
def perform
# faites ce que vous voulez
end
end
# Pour utiliser le job :
# exécutera en direct le job sans passer par le serveur worker
MonSuperJob.perform_now
# exécutera en direct le job en passant par le serveur worker
MonSuperJob.perform_later
# on utilisera principalement la deuxième option
L’option concurrency
permet de déterminer le nombre de job pouvant être exécuté simultanément
L’option queues
permet de définir l’ensemble des queues possible pour les jobs
Vous pouvez créer n’importe quel nom de queue
Définir les queues active_storage_analysis
et active_storage_purge
seulement si vous utilisez ActiveStorage.
Raison :
# config/sidekiq.yml
---
:concurrency: <%= ENV.fetch("SIDEKIQ_CONCURRENCY", 15).to_i %>
# Les chiffres à coté de la queue détermine l'importance
# plus le chiffre est haut plus c'est important.
:queues:
- ["default", 2]
- ["mailers", 2]
- ["active_storage_analysis", 1]
- ["active_storage_purge", 1]
Modifier le fichier Procfile
Ă la racine du projet
Ajouter l’addon Redis sur Scalingo (staging + production)
Se reporter au document ‣ pour connaître la configuration Scalingo
Déployer l’application
Définir la taille du container Worker et la quantité
Si votre application utilise des jobs occasionnellement, alors la taille S suffira
Vérifier que l’interface Sidekiq est bien accessible sur l’adresse /sidekiq
Configurer la variable d’environnement SIDEKIQ_CONCURRENCY
Raison :
En déployant l’application une première fois après la modification du Procfile, cela ajoutera le Container worker
L’addon Redis est un stockage de données en mémoire rapide utilisé par Sidekiq
La quantité du container worker après le premier déploiement est à 0. C’est pourquoi il faut le définir à 1.
On vient définir la variable d’env RAILS_MAX_THREADS=$SIDEKIQ_CONCURRENCY
afin de s’assurer que le nombre de pool de la basse de donnée est équivalent au nombre de process Sidekiq sinon on aura des erreurs :
ActiveRecord::ConnectionTimeoutError
could not obtain a connection from the pool within 5.000 seconds (waited 5.155 seconds); all pooled connections were in use (ActiveRecord::ConnectionTimeoutError)