ruby-on-rails - Heroku Scheduler 任务未按预期运行
问题描述
我正在使用 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
调度程序.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
解决方案
Heroku Scheduler 在文档中说
Scheduler 是一个免费的附加组件,不保证作业将在预定时间执行,或者根本不执行:
在极少数情况下,可能会跳过作业。
在极少数情况下,一个作业可能会运行两次。
我在某些情况下实现了这一点,我注意到几天后它无法与后台进程正常工作,然后再次阅读他们的文档并找出这个原因。
现在我已经实现了 sidekiq-scheduler并且它工作正常。
我希望它会有所帮助。
推荐阅读
- java - 用 HashMap 替换字符串中的字符
- python - 来自外部文件的分数在“前 5 名分数列表”中的排序不正确 - Python 游戏
- azure-devops - 如何在任务成功后通过“输出变量”部分或 Azure devops 中的其他方法更新管道变量
- github - GitHub 使用什么进行实时更新?不再有 websocket 或 SSE?
- javascript - .value 和 .nodeValue 的区别
- javascript - 多次单击按钮时如何更改inner.HTML
- azure - 如何在 golang 中生成 x5t 标头值
- flutter - 颤振自动填充不适用于文本字段
- amazon-dynamodb - GSI 全局二级索引是否允许使用 AWS DynamoDB 稀疏索引?
- python-3.x - ValueError:不支持的“设备类型”