Rails, Heroku и Resque: рабочие застряли в бесконечном «рабочем» состоянии

#ruby-on-rails #heroku #resque

#ruby-on-rails #heroku #resque

Вопрос:

У меня есть фоновое задание, которое может занять до 5 минут. Я только что проверил свою очередь Resque и вижу, что работают «75 рабочих», несмотря на то, что эти рабочие начали свою работу несколько дней назад.

Что это значит? Была ли работа завершена? Почему это так застряло и как мне справиться с этой ситуацией?

Вот моя работа:

 class CalculateRelevantEventRankingsForUser

   @queue = :calculate_relevant_event_rankings_for_user

  def self.perform(user_id, newly_voted_event_id)
    begin
      user = User.find(user_id)
      events_to_rerank = user.events_that_share_keywords(newly_voted_event_id)
      events_to_rerank.each do |e|
        e.rank(user_id)
      end
    rescue Resque::TermException
      Resque.enqueue(self, user_id, newly_voted_event_id)
    end
  end

end
  

И procfile:

 resque: env TERM_CHILD=1 bundle exec rake resque:workers QUEUE='*' COUNT='1'
  

введите описание изображения здесь

Комментарии:

1. У вас есть еще какая-нибудь информация, например, о том, как вы настраиваете очередь, или информация о вашем 5-минутном задании?

2. Добавлены некоторые дополнительные детали в OP

Ответ №1:

Может быть любое количество причин. Ваш поставщик redis мог выйти из строя и осиротеть экземпляры. Возможно, у вас закончилась память на redis. Я знаю, что ваше приложение было разработано для постановки в очередь тонны заданий в один момент.

Возможно, пользовательский интерфейс застрял, потому что эти идентификаторы заданий были потеряны в redis по той или иной причине.

Попробуйте запустить redis-cli monitor и проверить результат.

Если вы просто хотите очистить застрявшие задания: Resque.workers.each {|w| w.unregister_worker}

Повторяя мое ранее упомянутое предпочтение sidekiq. Основываясь на некоторых ваших предыдущих Qs, это может больше не быть проблемой. Я знаю, что вы потенциально вносили некоторые изменения в дизайн. Gl.

Комментарии:

1. Спасибо. В итоге я переключился на Sidekiq