您可以使用您Rails.cache
为每个参与者维护临时作业计数器,并根据活动作业的数量将作业分配到不同的队列。
您需要对作业进行子类化以支持不同的队列,并编写一个方法来解析为作业的正确类。就像是:
class Worker
cattr_acessor :tenant_id
class Worker::Low < Worker
@queue = :low
end
class Worker::High < Worker
@queue = :high
end
def self.queued
"#{name}::#{resolved_queue(tenant_id)}".constantize
end
def self.resolved_queue tenant_id
count = job_count(tenant_id)
if count > 1000
'Low'
else
'High'
end
end
def self.cache_key tenant_id
"job_count/#{tenant_id}"
end
def self.job_count tenant_id
Rails.cache.fetch(cache_key(tenant_id)){0}
end
def self.job_count_increment tenant_id
Rails.cache.fetch(cache_key(tenant_id)){0}
Rails.increment(cache_key(tenant_id)){0}
end
def self.job_count_decrement tenant_id
count = Rails.cache.fetch(cache_key(tenant_id)){0}
Rails.decrement(cache_key(tenant_id)){0} if count > 0
end
end
然后Worker.queued(tenant_id).perform
在您运行工作程序时调用,并确保在应用程序Worker.tenant_id
中设置为 on before_filters
。有关队列和优先级的更多信息,请参阅Resque Priorities 和 Queue Lists。
您应该在作业队列上调用增量并从作业中调用减量。
丑陋,但可行。
并且可以通过一些元编程变得更加枯燥 - 将这些方法提取到一个模块中,然后确保在模块包含上生成队列子类。