Domanda

Abbiamo un'applicazione Rails che è in esecuzione in un set-up MySQL master-slave per un po 'di tempo, utilizzando il master_slave_adapter plugin. Di recente, c'è stata una necessità per lo sfondo trattamento dei task in esecuzione lunga. Così abbiamo optato per DelayedJob .

Tavolo / modello di DelayedJob utilizza lo stesso adattatore master-slave. E mantiene la connessione slave vivo interrogando il tavolo. Ma la connessione master rimane inattiva per lunghi periodi di tempo, si chiude durante la notte, e la prossima volta che qualcuno si attiva un lavoro questo accade:

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')

Ho sentito cose cattive su come utilizzare l'opzione reconnect nel mio database.yml, perché presumibilmente non imposta il set di caratteri connessione dopo una riconnessione, come fa sulla prima inizializzazione di connessione.

Qual è il modo corretto di fare questo lavoro?

È stato utile?

Soluzione

FWIW, ora scimmia cerotto Delayed::Job nei due luoghi è importante. Ecco il blob:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top