寶石允許通過下一個策略保護工作獨特性:
戰略 | 這份工作被鎖定 | 這項工作已解鎖 |
---|---|---|
until_executing | 當被推到隊列時 | 處理開始時 |
until_executed | 當被推到隊列時 | 成功處理工作時 |
until_expired | 當被推到隊列時 | 當鎖定過期時 |
until_and_while_executing | 當被推到隊列時 | 處理開始時 獲取運行時鎖以防止同時工作 有額外的選項: runtime_lock_ttl , on_runtime_conflict |
while_executing | 處理開始時 | 處理工作時 任何結果包括錯誤 |
受兜帽的啟發,在引擎蓋下使用redlock。
將activejob-uniqueness
Gem添加到您的Gemfile中。
gem 'activejob-uniqueness'
如果您想為Sidekiq Web UI解鎖工作,請明確要求補丁。隊列清理變慢了!
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
並運行bundle install
命令。
ActiveJob ::唯一性可以在沒有任何配置的情況下工作。它將使用REDIS_URL
連接到redis實例。要覆蓋默認值,請使用以下命令創建一個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
您可以使用配置在全球設置默認值
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
所選策略會自動解鎖作業,但在某些情況下(例如,清除了隊列),手動解鎖作業很方便。
# 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!
很可能您不希望作業被鎖定在測試中。將此行添加到您的測試套件( rails_helper.rb
):
ActiveJob :: Uniqueness . test_mode!
ActiveJob ::獨特儀器ActiveSupport::Notifications
:
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
然後寫入ActiveJob::Base.logger
。
在第6.1
版之前的ActiveJob將始終記錄Enqueued MyJob (Job ID) ...
即使回調鏈被停止。細節
運行Redis服務器(在單獨的控制台中):
docker run --rm -p 6379:6379 redis
運行測試:
bundle
rake
ActiveJob ::唯一性支持Sidekiq API在隊列清理上解開工作鎖(例如,通過Sidekiq Web UI)。起始Sidekiq 5.1工作死亡還會觸發清理工作。考慮到大型排隊清理的變化要慢得多,因為每個作業都會單獨解鎖。為了激活sidekiq api補丁,需要在您的gemfile中明確它:
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
歡迎在https://github.com/veeqo/activejob-iniques上的GitHub上的錯誤報告和拉動請求。
根據MIT許可證的條款,該寶石可作為開源。
在Veeqo,我們的工程師團隊的任務是創建一個世界一流的庫存和運輸平台,該平台是最佳編碼實踐中最高標準的。我們是一支成長中的團隊,正在尋找其他熱情的開發人員加入我們的旅程。如果您正在尋找在電子商務中最激動人心的科技公司之一工作的職業,我們希望收到您的來信。
Veeqo開發人員博客