【问题标题】:Sidekiq/Redis queuing a job that doesn't existSidekiq/Redis 排队一个不存在的作业
【发布时间】:2020-01-25 03:45:48
【问题描述】:

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

这是我的测试工作:

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 文档,但我认为它对我没有任何帮助。

【问题讨论】:

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


    【解决方案1】:

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

    • 等待大约 3 周以达到最大重试次数
    • 如果您为 Sidekiq 设置了 UI 页面,则可以在“重试”选项卡中查看和清除这些作业
    • 深入研究 Redis CLI 文档,找到一种方法来识别这些特定作业并删除它们(如果您不担心失去其他作业,则将其全部清除)

    【讨论】:

      【解决方案2】:

      尝试在redis cli中调用$ 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
      

      【讨论】:

        猜你喜欢
        • 2015-07-06
        • 2021-09-16
        • 1970-01-01
        • 1970-01-01
        • 2013-12-20
        • 2019-01-14
        • 2021-02-16
        • 2017-07-25
        • 2018-06-29
        相关资源
        最近更新 更多