Permata memungkinkan untuk melindungi keunikan pekerjaan dengan strategi berikutnya:
Strategi | Pekerjaan itu terkunci | Pekerjaan dibuka |
---|---|---|
until_executing | Saat didorong ke antrian | Saat memproses dimulai |
until_executed | Saat didorong ke antrian | Saat pekerjaan diproses dengan sukses |
until_expired | Saat didorong ke antrian | Saat kuncinya kedaluwarsa |
until_and_while_executing | Saat didorong ke antrian | Saat memproses dimulai Kunci runtime diperoleh untuk mencegah pekerjaan simultan memiliki opsi tambahan: runtime_lock_ttl , on_runtime_conflict |
while_executing | Saat memproses dimulai | Saat pekerjaan diproses dengan hasil apa pun termasuk kesalahan |
Terinspirasi oleh Sidekiquniqejobs, menggunakan redlock di bawah kap.
Tambahkan permata activejob-uniqueness
ke Gemfile Anda.
gem 'activejob-uniqueness'
Jika Anda ingin pekerjaan membuka kunci untuk Sidekiq Web UI, memerlukan tambalan secara eksplisit. Pembersihan antrian menjadi lebih lambat!
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
Dan jalankan perintah bundle install
.
ActiveJob :: Keunikan siap bekerja tanpa konfigurasi apa pun. Ini akan menggunakan REDIS_URL
untuk terhubung ke instance redis. Untuk mengganti default, buat Config config/initializers/active_job_uniqueness.rb
menggunakan perintah berikut:
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
Anda dapat mengatur default secara global dengan konfigurasi
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
Strategi yang dipilih secara otomatis membuka kunci pekerjaan, tetapi dalam beberapa kasus (misalnya antrian dibersihkan), sangat berguna untuk membuka kunci pekerjaan secara manual.
# 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!
Kemungkinan besar Anda tidak ingin pekerjaan dikunci dalam tes. Tambahkan baris ini ke suite tes Anda ( rails_helper.rb
):
ActiveJob :: Uniqueness . test_mode!
ActiveJob :: Instrumen Keunikan ActiveSupport::Notifications
With Acara Berikutnya:
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
Dan kemudian menulis ke ActiveJob::Base.logger
.
ActiveJob sebelum versi 6.1
akan selalu Enqueued MyJob (Job ID) ...
bahkan jika rantai panggilan balik dihentikan. Detail
Jalankan server Redis (di konsol terpisah):
docker run --rm -p 6379:6379 redis
Jalankan tes dengan:
bundle
rake
ActiveJob :: Keunikan mendukung Sidekiq API untuk tidak mengatur kunci pekerjaan pada pembersihan antrian (misalnya melalui Sidekiq Web UI). Memulai Sidekiq 5.1 Kematian pekerjaan juga memicu pembersihan kunci. Mempertimbangkan bahwa pembersihan antrian besar menjadi jauh lebih lambat karena setiap pekerjaan tidak dikunci secara individual. Untuk mengaktifkan patch API Sidekiq mengharuskannya secara eksplisit di gemfile Anda:
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
Laporan bug dan permintaan tarik dipersilakan di GitHub di https://github.com/veqo/activejob-Unqueness.
Permata tersedia sebagai open source di bawah ketentuan lisensi MIT.
Di Veeqo, tim insinyur kami sedang dalam misi untuk membuat inventaris dan platform pengiriman kelas dunia, dibangun dengan standar tertinggi dalam praktik pengkodean terbaik. Kami adalah tim yang berkembang, mencari pengembang yang bersemangat untuk bergabung dengan kami dalam perjalanan kami. Jika Anda mencari karier yang bekerja untuk salah satu perusahaan teknologi paling menarik di eCommerce, kami ingin mendengar dari Anda.
Blog Veeqo Developers