【问题标题】:Heroku Scheduler task not running as expectedHeroku Scheduler 任务未按预期运行
【发布时间】:2018-11-15 16:07:36
【问题描述】:

我正在使用 Heroku 的 Scheduler 插件以预定的时间间隔在我的应用程序中运行作业,就像传统服务器环境中的 cron 一样。这些任务相当琐碎,因为它们只是将 sidekiq 工作人员排入队列。但是,如下图所示,:update_job_posts 由于某种原因未能在 4:30UTC 运行。

我无法以这种方式将这两个作业结合起来,还是它们需要单独运行

如果我使用heroku run 运行任务,它就会通过。 heroku run 用于执行您的作业,因此您可以放心,如果它与 heroku run 一起使用,它将在调度程序中运行。

$ heroku run rake scheduler:update_job_posts
Running rake scheduler:update_job_posts on ⬢ agile-temple-76502... up, run.6604 (Free)
Updating Job feed...
I, [2018-06-06T04:40:50.341411 #4]  INFO -- : [ActiveJob] Enqueued JobFeedImportJob (Job ID: e3b9a0ed-aacb-45af-84f9-ef02acfeb85e) to Sidekiq(default)
I, [2018-06-06T04:40:50.344400 #4]  INFO -- : [ActiveJob] Enqueued RemoteFeedImportJob (Job ID: b965853d-adb3-46ee-b48d-f19306ce9d2a) to Sidekiq(default)
done.

此外,heroku logs --tail 显示正在运行的其他任务:

heroku[scheduler.5009]: Starting process with command `bundle exec rake scheduler:update_news_articles`
heroku[scheduler.5009]: State changed from starting to up
app[scheduler.5009]: Updating News feed...
app[scheduler.5009]: I, [2018-06-06T04:31:05.636594 #4]  INFO -- : [ActiveJob] Enqueued NewsFeedImportJob (Job ID: d672b0c5-598b-4eb7-81b6-1a0d2d8a5891) to Sidekiq(default)
app[scheduler.5009]: done.
app[worker.1]: 4 TID-tfdlg NewsFeedImportJob JID-d999a576b3193a404b3d8fdd INFO: start
app[worker.1]: I, [2018-06-06T04:31:05.636769 #4]  INFO -- : [ActiveJob] [NewsFeedImportJob] [d672b0c5-598b-4eb7-81b6-1a0d2d8a5891] Performing NewsFeedImportJob from Sidekiq(default)
heroku[scheduler.5009]: Process exited with status 0
heroku[scheduler.5009]: State changed from up to complete

scheduler.rake

namespace :scheduler do
  desc "Enqueue sidekiq job, fetches events, and creates a record for new entries"
  task :update_event_feed => :environment do
    puts "Updating Event feed..."
    EventFeedImportJob.perform_later
    puts "done."
  end

  desc "Enqueue sidekiq job, fetches job posts, and creates a record for new entries"
  task :update_job_posts => :environment do
    puts "Updating Job feed..."
    JobFeedImportJob.perform_later
    RemoteFeedImportJob.perform_later
    puts "done."
  end

  desc "Enqueue sidekiq job, fetches news articles, and creates a record for new entries"
  task :update_news_articles => :environment do
    puts "Updating News feed..."
    NewsFeedImportJob.perform_later
    puts "done."
  end
end

【问题讨论】:

    标签: ruby-on-rails heroku scheduled-tasks rake rake-task


    【解决方案1】:

    Known issues and alternatives

    Heroku 调度器在文档中说

    Scheduler 是一个免费的插件,不保证作业会在预定的时间执行,或者根本不执行:

    在极少数情况下,可能会跳过作业。

    在极少数情况下,一个作业可能会运行两次。

    我在某些情况下实现了这一点,但几天后我注意到它无法与后台进程正常工作,然后再次阅读他们的文档并找出原因。

    现在我已经实现了sidekiq-scheduler,它工作正常。

    我希望它会有所帮助。

    【讨论】:

    • 奇怪的是,这两个作业运行,而一个没有运行,日志中没有错误。自周三以来,所有工作都按时进行。您是否只是在工作中需要“sidekiq-scheduler”并在config/sidekiq.yml 中设置:schedule?听起来太容易了!
    • 您是否曾在使用 sidekiq-scheduler 或运行所有作业时遇到过问题?
    • 是的,这当然非常简单,并且可以准确地运行所有作业
    • 我想我会做出改变的。 update_news_articles 作业今晚运行失败(根据我的原始消息,它们计划每天在同一时间运行);此故障也没有错误日志。我惊讶地发现 Heroku 调度程序的执行如此不一致。我错过了 14 篇未能运行的作业的新文章。
    猜你喜欢
    • 2016-12-28
    • 2016-12-18
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多