新手问题 异步定时任务 Sidekiq Whenever 问题

mz2test · 2016年03月21日 · 最后由 mz2test 回复于 2017年08月09日 · 4235 次阅读

各位,我现在碰到一个问题。在做异步任务的时候,我希望每天在指定时间执行一次异步任务。我是这样做的:

Gemfile

# 异步
gem 'sidekiq'
gem 'sidekiq-failures'
gem 'sidekiq-middleware'
gem 'whenever',:require => false  # 定时任务
gem 'sinatra', :require => nil

example_job.rb

class ExampleJob < ActiveJob::Base
  queue_as :default

  def perform(*args)
    # Do something later
    puts 'this is a JobExample...'
    Chamber.create(name: "test", url: "http://www.baidu.com")
  end
end

schedule.rb

every 1.minutes do
    runner "ExampleJob.perform_later()", :environment => :development
end

然后命令行中: whenever --update-crontab store bundle exec sidekiq

然后修改 schedule.rb 中的 Job,换用另外的一个 Job 任务执行,发现无法更换了。一直在执行 ExampleJob 这个任务。请问这是什么问题?

修改了 schedule.rb 之后,需要再次执行 whenever --update-crontab

#1 楼 @lgn21st 感谢你的回答。但再次执行

whenever --update-crontab

后,新的任务能够执行的,但是之前的那个任务还是在一直执行。那个 store 是什么意思,会不会是它的问题?

#2 楼 @mz2test 我没有看懂你这里的 store 是从何而来?

如果之前的任务一直在执行,说明 whenever 在 update 你的 crontab list 的时候,没有清除之前的任务,你可以自己手动清除

crontab -e

https://help.ubuntu.com/community/CronHowto

#3 楼 @lgn21st 非常感谢,这个问题解决了。

#4 楼 @mz2test 最佳实践应该是用 capistrano,然后 require 一下 whenever,发布的时候会自动更新定时脚本,这样也就不存在需要用crontab -e的情况了。

require 'whenever/capistrano'

或者可以考虑用这个 gem sidekiq-cron ,可以用 crontab 的语法来定义 schedule 的时间,并且 web UI 里还能看到所有 cron jobs

而且如果你只是需要异步的执行一个任务的话,直接用 rake task 也很方便吧,反正是在单独一个进程里的,也算是异步的。当然,除非你需要利用 sidekiq 的一些功能,那就只能用 sidekiq 了

都用 crontab 了,还套了一层 perform_later,用异步任务创建异步任务。。。

#6 楼 @tony612 sidekiq 跑定时任务最大问题就是内存很难清 感觉这个 gem 做了一件特别无意义的事。。。

和 whenever 恰恰相反,但 whenever 实用的多。

我们的实践是 whenever 和 sidekiq 已经足够满足需求了,配合 @ericguo 说的 capistrano 自动更新 cron job

#8 楼 @martin91 这个没有问题,并且是个很好的做法,因为你直接在 cronjob 里跑任务时各种数据反馈,失败报错和重试等都需要自己手撸,而你把这个任务分发到 Sidekiq 去执行能得到很好的管理和监控。

@lgn21st 刚发现,咱俩是老乡 0.0

mz2test 关闭了讨论。 08月09日 16:58
mz2test 重新开启了讨论。 08月09日 16:59
mz2test 关闭了讨论。 09月14日 09:11
mz2test 重新开启了讨论。 09月14日 09:12
需要 登录 后方可回复, 如果你还没有账号请 注册新账号