#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