سؤال

لدينا تطبيق 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top