Differita Lavoro e `schiava adapter` padrone; perdere la connessione master
-
01-10-2019 - |
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?
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