🎯 Intention


Configurer et créer un job qui tournera en arrière plan avec Sidekiq

<aside> ✅ Pré-requis

✅ Points clés


<aside> ⌛ Temps indicatif : 0.5J

</aside>

Etape

Visuel / Exemple


📦 Installer la gem Sidekiq

Raison :

La configuration minimum pour utiliser Sidekiq

# config/application.rb

class Application < Rails::Application
  # ...
  config.active_job.queue_adapter = :sidekiq
end

📺 Configurer Sidekiq UI

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

📝 Créer votre premier 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

🔧 Configurer les options de Sidekiq

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]

🚀 Préparer et déployer le serveur Worker

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)