如何解决如何限制基于kubernetes集群的delay_job处理
我正在寻找一种隔离我的审核环境处理哪些作业的方法。
我们正在使用delay_job,并且正在基于主集群运行一些kubernetes别名集群。
这有可能吗?我找到了一种简单地为工人的名字加上前缀的方法,但是我找不到将其传递给实际工作的方法。
感谢您的帮助。
我认为它应该工作的方式is something like this。
我不确定这是否是正确的方法,也许使用生命周期事件可以实现相同的目的?我只是添加一列,并使用生命周期事件添加数据并查询它?
交叉发布到collectiveidea/delayed_job/issues/1125
解决方法
最终,我得到了以下解决方案。将一个名为cluster的varchar列添加到delay_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']
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。