Sidekiq / Redis对不存在的作业进行排队

时间:2019-09-25 01:46:25

标签: ruby-on-rails redis cron sidekiq sidekiq-cron

我为Sidekiq构建了一个简单的测试作业,并将其添加到Sidekiq Cron的schedule.yml文件中。

这是我的测试工作:

module Slack
  class TestJob < ApplicationJob
    queue_as :default

    def perform(*args)
      begin
        SLACK_NOTIFIER.post(attachments: {"pretext": "test", "text": "hello"})
      rescue Exception => error
        puts error
      end
    end
  end
end

这里的SLACK_NOTIFIER是我在启动时初始化的Slack的简单API客户端。

在我的schedule.yml中:

test_job:
  cron: "* * * * *"
  class: "Slack::TestJob"
  queue: default
  description: "Test"

所以我想让它每分钟运行一次,并且它的运行完全符合我的预期。

但是,我现在已经删除了作业文件,并从schedule.yml中删除了该作业,它仍然尝试每分钟运行一次作业。我已经进入了sidekiq仪表板,并且看到大量重试该工作的信息。不管我杀了他们多少次,它们都会一直来。

我已经尝试多次关闭redis服务器和sidekiq。我尝试关闭计算机(当然,在杀死服务器之后)。它仍然会继续安排这些作业,并打断我的其他作业,因为它会引发以下异常:

NameError: uninitialized constant Slack::TestJob

我已经在项目范围内搜索“ TestJob”,但没有结果。

我只用大约10分钟的时间打开了Redis服务器并完成了这项工作...

redis数据库中是否可能有残留?我研究了redis-cli文档,但我认为没有任何帮助。

2 个答案:

答案 0 :(得分:2)

尝试在redis客户端中致电$ FLUSHALL ...

除此之外...

sidekiq-cron documentation似乎希望您明确检查schedule.yml的存在...

#initializers/sidekiq.rb
schedule_file = "config/schedule.yml"

if File.exist?(schedule_file) && Sidekiq.server?
  Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
end

答案 1 :(得分:0)

Sidekiq的默认值为retry a failed job 25 times。因为工作不存在,所以每次都会失败。 Sidekiq只知道作业失败(因为尝试执行不存在的作业会引发异常),因此将其标记为重试... 25次。由于您每分钟都在计划该作业,因此可能有大量的这些失败的作业排队等待重试。您可以:

  • 等待〜3周以达到最大重试次数
  • 如果您为Sidekiq设置了UI页面,则可以在“重试”标签中查看并清除这些作业
  • 在Redis CLI文档中进行挖掘,以找到一种方法来识别这些特定作业并删除它们(如果您不担心丢失其他作业,则可以刷新整个内容)