0

master_slave_adapterプラグインを使用して、しばらくの間 MySQL マスター/スレーブ設定で実行されている Rails アプリケーションがあります。最近、長時間実行されるタスクのバックグラウンド処理が必要になりました。そこで、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

これを機能させる適切な方法は何ですか?

4

1 に答える 1

1

FWIW、Delayed::Job重要な 2 つの場所にモンキー パッチを適用するようになりました。ブロブは次のとおりです。

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
于 2010-11-22T21:00:16.620 に答える