Le GEM permet de protéger l'unicité de l'emploi avec les prochaines stratégies:
Stratégie | Le travail est verrouillé | Le travail est déverrouillé |
---|---|---|
until_executing | Lorsqu'il est poussé à la file d'attente | Lorsque le traitement démarre |
until_executed | Lorsqu'il est poussé à la file d'attente | Lorsque le travail est traité avec succès |
until_expired | Lorsqu'il est poussé à la file d'attente | Lorsque le verrou est expiré |
until_and_while_executing | Lorsqu'il est poussé à la file d'attente | Lorsque le traitement démarre Un verrouillage d'exécution est acquis pour empêcher les travaux simultanés A des options supplémentaires: runtime_lock_ttl , on_runtime_conflict |
while_executing | Lorsque le traitement démarre | Lorsque le travail est traité avec n'importe quel résultat incluant une erreur |
Inspiré par SidekiQuniqueJobs, utilise Redlock sous le capot.
Ajoutez le joyau activejob-uniqueness
à votre gemfile.
gem 'activejob-uniqueness'
Si vous souhaitez que les emplois se déverrouillent pour l'interface utilisateur Web Sidekiq, nécessitez explicitement le correctif. La file d'attente le nettoyage devient plus lent!
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
Et exécutez la commande bundle install
.
ActiveJob :: Uniciness est prêt à travailler sans aucune configuration. Il utilisera REDIS_URL
pour se connecter à l'instance redis. Pour remplacer les valeurs par défaut, créez une config/initializers/active_job_uniqueness.rb
à l'aide de la commande suivante:
rails generate active_job:uniqueness:install
class MyJob < ActiveJob :: Base
# new jobs with the same args will raise error until existing one is executed
unique :until_executed
def perform ( args )
# work
end
end
class MyJob < ActiveJob :: Base
# new jobs with the same args will be logged within 3 hours or until existing one is being executing
unique :until_executing , lock_ttl : 3 . hours , on_conflict : :log
def perform ( args )
# work
end
end
Vous pouvez définir les paramètres par défaut dans le monde avec la configuration
class MyJob < ActiveJob :: Base
# Proc gets the job instance including its arguments
unique :until_executing , on_conflict : -> ( job ) { job . logger . info "Oops: #{ job . arguments } " }
def perform ( args )
# work
end
end
class MyJob < ActiveJob :: Base
unique :until_executed
def perform ( foo , bar , baz )
# work
end
def lock_key_arguments
arguments . first ( 2 ) # baz is ignored
end
end
class MyJob < ActiveJob :: Base
unique :until_executed
def perform ( foo , bar , baz )
# work
end
def lock_key
'qux' # completely custom lock key
end
def runtime_lock_key
'quux' # completely custom runtime lock key for :until_and_while_executing
end
end
La stratégie sélectionnée déverrouille automatiquement les travaux, mais dans certains cas (par exemple, la file d'attente est purgée), il est pratique de déverrouiller les travaux manuellement.
# Remove the lock for particular arguments:
MyJob . unlock! ( foo : 'bar' )
# or
ActiveJob :: Uniqueness . unlock! ( job_class_name : 'MyJob' , arguments : [ { foo : 'bar' } ] )
# Remove all locks of MyJob
MyJob . unlock!
# or
ActiveJob :: Uniqueness . unlock! ( job_class_name : 'MyJob' )
# Remove all locks
ActiveJob :: Uniqueness . unlock!
Vous ne voulez pas probablement que les emplois soient verrouillés dans les tests. Ajoutez cette ligne à votre suite de tests ( rails_helper.rb
):
ActiveJob :: Uniqueness . test_mode!
ActiveJob :: Instruments d'unicité ActiveSupport::Notifications
avec les prochains événements:
lock.active_job_uniqueness
runtime_lock.active_job_uniqueness
unlock.active_job_uniqueness
runtime_unlock.active_job_uniqueness
conflict.active_job_uniqueness
runtime_conflict.active_job_uniqueness
Puis écrit sur ActiveJob::Base.logger
.
ActiveJob avant la version 6.1
enregistrera toujours Enqueued MyJob (Job ID) ...
même si la chaîne de rappel est interrompue. Détails
Exécutez Redis Server (dans une console séparée):
docker run --rm -p 6379:6379 redis
Exécutez des tests avec:
bundle
rake
ActiveJob :: Uniciness prend en charge l'API Sidekiq pour unser les verrous de travail sur les files d'attente (par exemple via l'interface utilisateur Web Sidekiq). Debout Sidekiq 5.1 La mort du travail déclenche également les verrous du nettoyage. Tenez compte du nettoyage des grandes files d'attente devient beaucoup plus lent car chaque travail est déverrouillé individuellement. Afin d'activer le patch API Sidekiq le nécessite explicitement dans votre gemfile:
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
Les rapports de bogues et les demandes de traction sont les bienvenus sur GitHub sur https://github.com/veeqo/activejob-unité.
Le GEM est disponible en open source en vertu des termes de la licence du MIT.
Chez Veeqo, notre équipe d'ingénieurs a pour mission de créer une plate-forme d'inventaire et d'expédition de classe mondiale, construite selon les normes les plus élevées dans les meilleures pratiques de codage. Nous sommes une équipe croissante, à la recherche d'autres développeurs passionnés pour nous rejoindre dans notre voyage. Si vous cherchez une carrière travaillant pour l'une des entreprises technologiques les plus excitantes du commerce électronique, nous voulons avoir de vos nouvelles.
Blog Veeqo Developers