有没有办法告诉所有工作人员停止处理特定队列(或所有队列)的任何新作业?
我们偶尔会遇到需要的系统不可用(断电、硬件故障等)的问题,关闭这些队列中的作业处理直到系统重新联机会很有帮助。
与其让每个作业都确定所有子系统都处于好/坏状态,不如让一些信号通知队列进入休眠状态,然后在子系统再次准备好时让它们恢复活力,这将很有帮助。
一个严厉的方法是外部关闭所有工人。
有没有办法告诉所有工作人员停止处理特定队列(或所有队列)的任何新作业?
我们偶尔会遇到需要的系统不可用(断电、硬件故障等)的问题,关闭这些队列中的作业处理直到系统重新联机会很有帮助。
与其让每个作业都确定所有子系统都处于好/坏状态,不如让一些信号通知队列进入休眠状态,然后在子系统再次准备好时让它们恢复活力,这将很有帮助。
一个严厉的方法是外部关闭所有工人。
文档提到您可以使用这些信号来启动/继续 resque 作业。
信号
Resque 工作人员会响应几个不同的信号:
...
USR2 - 不要开始处理任何新工作
继续 - 在 USR2 之后再次开始处理新作业
来自:https ://github.com/resque/resque/tree/cf0897709e857bd557dc7e407e282dc0f2b461df#signals
这个要点,展示了如何对 resque 进行猴子修补以停止接受新工作。
暂停 resque 后,它可能仍在处理一些工作。这是一个 rake 任务,它等待 10 分钟让所有作业完成,10 分钟后如果仍有作业在运行,它们会被杀死:
stop_at = Time.now
until Resque.working.empty?
Rails.logger.info "Waiting for #{Resque.info[:working].length} jobs to finish"
sleep(30.seconds)
if stop_at < 10.minutes.ago
Rails.logger.info 'Killing all jobs that didnt finish in 10 minutes...'
Resque.working.map(&:unregister_worker)
end
end