DelayedJob и `master_slave_adapter`;потеря основного соединения - PullRequest
0 голосов
/ 29 июня 2010

У нас есть приложение Rails, которое какое-то время работает в настройке «главный-подчиненный» MySQL, используя плагин master_slave_adapter .В последнее время возникла необходимость в фоновой обработке долгосрочных задач.Итак, мы остановились на DelayedJob .

В таблице / модели DelayedJob используется один и тот же адаптер ведущий-ведомый.И это поддерживает связь подчиненного, опрашивая стол.Но главное соединение остается свободным в течение длительных периодов времени, закрывается на ночь, и в следующий раз, когда кто-то активирует работу, это происходит:

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, потому что он якобы не устанавливает набор символов соединения после переподключения, как это происходит при первой инициализации соединения.

Как правильно сделать эту работу?

1 Ответ

1 голос
/ 23 ноября 2010

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...