Sidekiq/Redis 正在排队一项不存在的工作

Sidekiq/Redis queuing a job that doesn't exist

我为 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",但没有得到任何结果。

我只用这个作业打开了 redis 服务器大约 10 分钟...

redis 数据库中是否有残留的东西?我查看了 redis-cli 文档,但我认为它对我没有任何帮助。

尝试在 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

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

  • 等待 ~3 周以达到最大重试次数
  • 如果您为 Sidekiq 设置了 UI 页面,您可以在“重试”选项卡中查看并清除这些作业
  • 仔细阅读 Redis CLI 文档,找出识别这些特定作业并删除它们的方法(如果您不担心丢失其他作业,也可以清除整个作业)