تأخير Job و `master_slave_adapter` ؛ فقدان الاتصال الرئيسي
-
01-10-2019 - |
سؤال
لدينا تطبيق Rails الذي يعمل في إعداد MySQL Master-Slists لفترة من الوقت الآن ، باستخدام Master_slave_adapter توصيل في. في الآونة الأخيرة ، كانت هناك حاجة لمعالجة الخلفية للمهام طويلة المدى. لذلك استقرنا على تأخير.
يستخدم جدول/طراز تأخير Job نفس محول العبد الرئيسي. ويبقي اتصال الرقيق على قيد الحياة من خلال استقصاء الجدول. لكن الاتصال الرئيسي يظل خاملاً لفترات طويلة من الزمن ، ويغلق بين عشية وضحاها ، وفي المرة القادمة التي يقوم فيها شخص ما بتنشيط وظيفة يحدث هذا:
Mysql::Error: MySQL server has gone away: UPDATE `delayed_jobs` SET locked_by = null, locked_at = null WHERE (locked_by = 'delayed_job host:[snip] pid:20481')
سمعت أشياء سيئة حول استخدام reconnect
الخيار في بلدي database.yml
, ، لأنه لا يُزعم أنه لم يضبط حرف الاتصال بعد إعادة الاتصال ، كما هو الحال في تهيئة الاتصال الأول.
ما هي الطريقة الصحيحة لجعل هذا العمل؟
المحلول
fwiw ، نحن الآن رقعة القرد Delayed::Job
في المكانين يهم. ها هي النقطة:
module Delayed
class Job < ActiveRecord::Base
class << self
def refresh_connections_for_delayed_job
# Do a cheap check to see if we're actually using master-slave.
if (c = self.connection).respond_to? :master_connection
c.master_connection.reconnect! unless c.master_connection.active?
end
end
def clear_locks_with_connection_refresh!(worker_name)
self.refresh_connections_for_delayed_job
self.clear_locks_without_connection_refresh!(worker_name)
end
alias_method_chain :clear_locks!, :connection_refresh
end
def lock_exclusively_with_connection_refresh!(max_run_time, worker)
self.class.refresh_connections_for_delayed_job
self.lock_exclusively_without_connection_refresh!(max_run_time, worker)
end
alias_method_chain :lock_exclusively!, :connection_refresh
end
end