Das Edelstein ermöglicht es, die Einzigartigkeit der Arbeit mit den nächsten Strategien zu schützen:
Strategie | Der Job ist verschlossen | Der Job wird freigeschaltet |
---|---|---|
until_executing | Wenn er in die Warteschlange gedrückt wird | Zu Beginn der Verarbeitung |
until_executed | Wenn er in die Warteschlange gedrückt wird | Wenn der Job erfolgreich bearbeitet wird |
until_expired | Wenn er in die Warteschlange gedrückt wird | Wenn das Schloss abgelaufen ist |
until_and_while_executing | Wenn er in die Warteschlange gedrückt wird | Zu Beginn der Verarbeitung Eine Laufzeitschloss wird erworben, um gleichzeitige Jobs zu verhindern hat zusätzliche Optionen: runtime_lock_ttl , on_runtime_conflict |
while_executing | Zu Beginn der Verarbeitung | Wenn der Job bearbeitet wird mit jedem Ergebnis einschließlich eines Fehlers |
Inspiriert von Sidekiquniquejobs verwendet Redlock unter der Motorhaube.
Fügen Sie Ihr GemFile das Edelstein activejob-uniqueness
hinzu.
gem 'activejob-uniqueness'
Wenn Sie Jobs für die Sidekiq -Web -Benutzeroberfläche entsperren möchten, benötigen Sie den Patch explizit. Die Warteschlangenreinigung wird langsamer!
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
Und bundle install
-Befehl ausführen.
ActiveJob :: Einzigartigkeit ist ohne Konfiguration bereit zu arbeiten. Es wird REDIS_URL
verwendet, um eine Verbindung zur Redis -Instanz herzustellen. Um die Standardeinstellungen zu überschreiben, erstellen Sie mit dem folgenden Befehl eine Initializer config/initializers/active_job_uniqueness.rb
:
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
Sie können Standardeinstellungen mit der Konfiguration global festlegen
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
Die ausgewählte Strategie entsperren automatisch Arbeitsplätze, aber in einigen Fällen (z. B. die Warteschlange ist reinigt) ist es praktisch, Jobs manuell freizuschalten.
# 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!
Höchstwahrscheinlich möchten Sie nicht, dass Jobs in Tests gesperrt werden. Fügen Sie diese Zeile Ihrer Testsuite ( rails_helper.rb
) hinzu:
ActiveJob :: Uniqueness . test_mode!
ActiveJob :: Einzigartigkeitsinstrumente ActiveSupport::Notifications
mit den nächsten Ereignissen:
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
Und schreibt dann an ActiveJob::Base.logger
.
ActiveJOB vor Version 6.1
wird immer Enqueued MyJob (Job ID) ...
auch wenn die Rückrufkette gestoppt wird. Details
REDIS -Server ausführen (in separater Konsole):
docker run --rm -p 6379:6379 redis
Führen Sie Tests mit: aus:
bundle
rake
ActiveJob :: Einzigartigkeit unterstützt die Sidekiq -API, um die Aufräumarbeiten für die Warteschlange (z. B. über die Sidekiq -Web -UI) zu verabschieden. Starten des Sidekiq 5.1 Job Death löst auch die Reinigung von Schlössern aus. Berücksichtigen Sie, dass die Bereinigung der großen Warteschlangen viel langsamer wird, da jeder Job einzeln entsperrt wird. Um den Sidekiq -API -Patch zu aktivieren, benötigen Sie dies in Ihrer GemFile explizit:
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
Fehlerberichte und Pull-Anfragen sind auf Github unter https://github.com/veeqo/activejob-uniqueness willkommen.
Das Edelstein ist unter den Bedingungen der MIT -Lizenz als Open Source erhältlich.
Bei Veeqo ist unser Team von Ingenieuren auf der Mission, eine erstklassige Inventar- und Versandplattform zu erstellen, die nach den höchsten Standards bei den besten Codierungspraktiken aufgebaut ist. Wir sind ein wachsendes Team, das nach anderen leidenschaftlichen Entwicklern sucht, die uns auf unserer Reise anschließen. Wenn Sie nach einer Karriere suchen, die für eines der aufregendsten Technologieunternehmen im E -Commerce arbeitet, möchten wir von Ihnen hören.
Veeqo Developers Blog