1

有没有办法告诉所有工作人员停止处理特定队列(或所有队列)的任何新作业?

我们偶尔会遇到需要的系统不可用(断电、硬件故障等)的问题,关闭这些队列中的作业处理直到系统重新联机会很有帮助。

与其让每个作业都确定所有子系统都处于好/坏状态,不如让一些信号通知队列进入休眠状态,然后在子系统再次准备好时让它们恢复活力,这将很有帮助。

一个严厉的方法是外部关闭所有工人。

4

2 回答 2

1

文档提到您可以使用这些信号来启动/继续 resque 作业。

信号

Resque 工作人员会响应几个不同的信号:

...

USR2 - 不要开始处理任何新工作

继续 - 在 USR2 之后再次开始处理新作业

来自:https ://github.com/resque/resque/tree/cf0897709e857bd557dc7e407e282dc0f2b461df#signals

于 2016-06-16T02:44:41.880 回答
0

这个要点,展示了如何对 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
于 2017-10-05T14:00:10.767 回答