宝石は、次の戦略で仕事の独自性を保護することを可能にします。
戦略 | 仕事はロックされています | ジョブはロック解除されています |
---|---|---|
until_executing | キューに押し込まれたとき | 処理が始まるとき |
until_executed | キューに押し込まれたとき | ジョブが正常に処理されたとき |
until_expired | キューに押し込まれたとき | ロックが期限切れになったとき |
until_and_while_executing | キューに押し込まれたとき | 処理が始まるとき 同時ジョブを防ぐために、ランタイムロックが取得されます 追加のオプションがあります: runtime_lock_ttl 、 on_runtime_conflict |
while_executing | 処理が始まるとき | ジョブが処理されるとき エラーを含む任意の結果 |
Sidekiquniquejobsに触発され、フードの下でRedlockを使用しています。
activejob-uniqueness
GemをGemfileに追加します。
gem 'activejob-uniqueness'
SideKIQ Web UIのジョブのロックを解除したい場合は、パッチを明示的に必要とします。キューのクリーンアップが遅くなります!
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
bundle install
コマンドを実行します。
Activejob :: unovenessは、構成なしで動作する準備ができています。 REDIS_URL
使用してRedisインスタンスに接続します。デフォルトをオーバーライドするには、次のコマンドを使用して、初期化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 :: uniqueness Instrumention 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 :: uniquenessは、sidekiq APIをサポートして、キュークリーンアップでジョブロックを解除します(sidskiq web UI経由)。 Sidekiq 5.1の開始職務死もロッククリーンアップをトリガーします。各ジョブが個別にロック解除されているため、大きなキューのクリーンアップがはるかに遅くなることを考慮してください。 SideKIQ APIパッチをアクティブにするには、Gemfileで明示的に必要です。
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
バグレポートとプルリクエストは、https://github.com/veeqo/activejob-uniquenessのGithubで大歓迎です。
宝石は、MITライセンスの条件の下でオープンソースとして利用できます。
Veeqoでは、私たちのエンジニアチームは、最高のコーディングプラクティスで最高水準に基づいて構築された、世界クラスの在庫と輸送プラットフォームを作成することを使命としています。私たちは成長しているチームであり、私たちの旅に参加する他の情熱的な開発者を探しています。 eコマースで最もエキサイティングなハイテク企業の1つで働いているキャリアを探しているなら、私たちはあなたから聞きたいです。
Veeqo Developersブログ