تسمح الجوهرة بحماية تفرد الوظيفة مع الاستراتيجيات التالية:
الاستراتيجية | الوظيفة مغلقة | تم فتح الوظيفة |
---|---|---|
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 ، فاطلب التصحيح بشكل صريح. طوابير تنظيف يصبح أبطأ!
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
وتشغيل أمر bundle install
.
ActiveJob :: التفرد جاهز للعمل دون أي تكوين. سوف يستخدم 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 :: تفرد أدوات 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 Server (في وحدة تحكم منفصلة):
docker run --rm -p 6379:6379 redis
إجراء الاختبارات مع:
bundle
rake
ActiveJob :: Exhiqueness يدعم Sidekiq API لتوضيح أقفال الوظائف على التنظيف في قوائم الانتظار (على سبيل المثال عبر واجهة المستخدم على الويب Sidekiq). بدء Sidekiq 5.1 الوظيفية الموت يؤدي أيضا إلى تنظيف الأقفال. ضع في اعتبارك أن تنظيف قوائم الانتظار الكبيرة يصبح أبطأ بكثير لأن كل وظيفة يتم فتحها بشكل فردي. من أجل تنشيط تصحيح API SidekiQ يتطلب ذلك بشكل صريح في Gemfile:
gem 'activejob-uniqueness' , require : 'active_job/uniqueness/sidekiq_patch'
يتم الترحيب بتقارير الأخطاء وطلبات السحب على Github على https://github.com/veeqo/activejob-uniqueness.
الجوهرة متوفرة كمصدر مفتوح بموجب شروط ترخيص معهد ماساتشوستس للتكنولوجيا.
في Veeqo ، يقوم فريق المهندسين لدينا بمهمة إنشاء منصة مخزون وشحن من الطراز العالمي ، تم تصميمه وفقًا لأعلى المعايير في أفضل ممارسات الترميز. نحن فريق متزايد ، نبحث عن مطورين متحمسين آخرين للانضمام إلينا في رحلتنا. إذا كنت تبحث عن مهنة تعمل في واحدة من أكثر شركات التكنولوجيا إثارة في التجارة الإلكترونية ، فنحن نريد أن نسمع منك.
مدونة Veeqo Developers