อัญมณีอนุญาตให้ปกป้องความเป็นเอกลักษณ์ของงานด้วยกลยุทธ์ต่อไป:
กลยุทธ์ | งานถูกล็อค | งานถูกปลดล็อค |
---|---|---|
until_executing | เมื่อ ผลัก ไปที่คิว | เมื่อ เริ่มการประมวลผล |
until_executed | เมื่อ ผลัก ไปที่คิว | เมื่องานถูก ประมวลผลสำเร็จ |
until_expired | เมื่อ ผลัก ไปที่คิว | เมื่อล็อค หมดอายุ |
until_and_while_executing | เมื่อ ผลัก ไปที่คิว | เมื่อ เริ่มการประมวลผล ล็อครันไทม์ได้มาเพื่อ ป้องกันงานพร้อมกัน มีตัวเลือกเพิ่มเติม: runtime_lock_ttl , on_runtime_conflict |
while_executing | เมื่อ เริ่มการประมวลผล | เมื่องานถูก ประมวลผล ด้วยผลลัพธ์ใด ๆ รวมถึงข้อผิดพลาด |
แรงบันดาลใจจาก SidekiquniqueJobs ใช้ Redlock ภายใต้ประทุน
เพิ่มอัญมณี activejob-uniqueness
ลงใน 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
ActiveJob ก่อนเวอร์ชัน 6.1
จะบันทึก Enqueued MyJob (Job ID) ...
แม้ว่าห่วงโซ่การโทรกลับจะหยุดลง รายละเอียด
เรียกใช้เซิร์ฟเวอร์ Redis (ในคอนโซลแยกต่างหาก):
docker run --rm -p 6379:6379 redis
เรียกใช้การทดสอบด้วย:
bundle
rake
ActiveJob :: Uniqueness รองรับ sidekiq API เพื่อ Unset ล็อคงานในการล้างคิว (เช่นผ่าน Web UI Sidekiq) การเริ่มต้น Sidekiq 5.1 การตายของงานยังกระตุ้นการทำความสะอาดล็อค คำนึงถึง การทำความสะอาดคิวขนาดใหญ่ช้าลงมาก เพราะแต่ละงานถูกปลดล็อคเป็นรายบุคคล ในการเปิดใช้งานแพตช์ sidekiq api จำเป็นต้องมีอย่างชัดเจนใน gemfile ของคุณ:
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
รายงานข้อผิดพลาดและคำขอดึงยินดีต้อนรับบน GitHub ที่ https://github.com/veeqo/activejob-uniqueness
อัญมณีมีให้เป็นโอเพ่นซอร์สภายใต้ข้อกำหนดของใบอนุญาต MIT
ที่ Veeqo ทีมวิศวกรของเราอยู่ในภารกิจในการสร้างสินค้าคงคลังและแพลตฟอร์มการจัดส่งระดับโลกที่สร้างขึ้นเพื่อมาตรฐานสูงสุดในการเขียนโค้ดที่ดีที่สุด เราเป็นทีมที่กำลังเติบโตมองหานักพัฒนาที่หลงใหลอื่น ๆ เพื่อเข้าร่วมกับเราในการเดินทางของเรา หากคุณกำลังมองหาอาชีพที่ทำงานให้กับหนึ่งใน บริษัท เทคโนโลยีที่น่าตื่นเต้นที่สุดในอีคอมเมิร์ซเราต้องการได้ยินจากคุณ
บล็อกนักพัฒนา Veeqo