Как ограничить обработку delayed_job на основе кластера kubernetes

Я ищу способ изолировать, какая из моих сред обзора обрабатывает какие задания.

Мы используем delayed_job и запускаем несколько кластеров псевдонимов kubernetes на основе главного кластера.

Это вообще возможно? Я нашел способ просто добавить префикс имени работника, но я не могу найти способ передать это фактической работе.

Любая помощь приветствуется.

Как я понял, это должно работать примерно так.

Я не уверен, что это правильный путь, возможно, то же самое можно было бы достичь с помощью событий жизненного цикла? Я просто добавляю столбец и использую события жизненного цикла, чтобы добавить данные и запросить их?

Опубликовано на collectiveidea/delayed_job/issues/1125


person mhenrixon    schedule 02.11.2020    source источник


Ответы (1)


В итоге я пришел к следующему решению. Добавьте столбец varchar с именем cluster в таблицу delayed_jobs и BOOM. Работает как шарм.

require 'delayed/backend/active_record'

module Delayed
  module Backend
    module ActiveRecord
      class Configuration
        attr_accessor :cluster
      end

      # A job object that is persisted to the database.
      # Contains the work object as a YAML field.
      class Job < ::ActiveRecord::Base
        READY_SQL = <<~SQL.squish.freeze
          ((cluster = ? AND run_at <= ? AND (locked_at IS NULL OR locked_at < ?)) OR locked_by = ?) AND failed_at IS NULL
        SQL

        before_save :set_cluster

        def self.ready_to_run(worker_name, max_run_time)
          where(READY_SQL, cluster, db_time_now, db_time_now - max_run_time, worker_name)
        end

        # When a worker is exiting, make sure we don't have any locked jobs.
        def self.clear_locks!(worker_name)
          where(cluster: cluster, locked_by: worker_name)
            .update_all(locked_by: nil, locked_at: nil) # rubocop:disable Rails/SkipsModelValidations
        end

        def self.cluster
          Delayed::Backend::ActiveRecord.configuration.cluster
        end

        def set_cluster
          self.cluster ||= self.class.cluster
        end
      end
    end
  end
end

Delayed::Backend::ActiveRecord.configuration.cluster = ENV['CLUSTER'] if ENV['CLUSTER']
person mhenrixon    schedule 03.11.2020