Sidekiq / Redis в очереди на работу, которая не существует - PullRequest
3 голосов
/ 25 сентября 2019

Я создал простое тестовое задание для 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простой API-клиент для Slack, который я инициализирую при запуске.

И в моем 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, но не думаю, что она мне поможет.

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Попробуйте позвонить $ FLUSHALL в Redis Cli ...

Кроме этого ...

Документация sidekiq-cron , кажется, ожидает, что вы проверитеза существование 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
0 голосов
/ 26 сентября 2019

По умолчанию для Sidekiq повторять неудачное задание 25 раз .Поскольку работа не существует, она терпит неудачу ... каждый раз;Sidekiq знает только, что задание не выполняется (потому что попытка выполнить несуществующее задание вызовет исключение), поэтому он помечает его для повторной попытки ... 25 раз.Поскольку вы планировали эту работу каждую минуту, вы, вероятно, получили ТОНН этих неудачных заданий, поставленных в очередь для повторной попытки.Вы можете:

  • Подождите ~ 3 недели, чтобы набрать максимальное количество попыток
  • Если у вас настроена страница пользовательского интерфейса для Sidekiq, вы можете увидеть и очистить эти задания в Retriestab
  • Пролистайте документацию Redis CLI, чтобы найти способ идентифицировать эти конкретные задания и удалить их (или очистить все это, если вы не беспокоитесь о потере других заданий)
...