Rails Production 下大家都是怎么解决定时任务的?

kevinzhow · 2014年01月05日 · 最后由 hisea 回复于 2014年01月06日 · 4404 次阅读

1.Rake 这个不用说了,Cron + Rake 是最常规的,但是对于短任务,却要花长时间初始化资源的情况这个就不是那么合适,所以我用了下面的方法

2.HTTP Request Cron 一个定时的 HTTP Request,来触发任务处理,目前没有遇到什么问题

不知道大家都在有什么方法,欢迎讨论

交给队列去处理,写一个脚本插入数据到 redis 中

直接 crontab 就算某些服务停了也 OK

感觉 crontab 很难管理,要是有 sae 这样的定时任务 API 服务就好了。

#3 楼 @shiny 有一个叫做 whenever 的 gem,可以管理 crontab 任务。

whenever +1 crontab 直接用也挺好的。。

#1 楼 @Ddl1st #2 楼 @wuwx #3 楼 @shiny #5 楼 @tylerlong #6 楼 @jasl #7 楼 @ericguo 楼上各位都没有理解楼主的问题,我觉得楼主可能要补充说明一下。 楼主的提问是:Cron+Rake 时,Rake 任务初始化时间过长,对此有没有更好的解决方案。

一样是 Cron + Rake/HTTP Request ....

因为全部使用 Cron + Rake 有些任务初始化的时间就够等的了 - -||

不过由于用了 Sidekiq , 所以 HTTP Request 其实是暴露一个 Local API 给 Cron 调用以及传参,最终代码在 Sidekiq 的 Woker 中。

@kevinzhow 你可能需要详细说说你说的短任务是什么样子的,感觉可能是设计上的问题,为什么不能通过队列来解决?为什么不能容忍初始化的时间等等

#1 楼 @Ddl1st #2 楼 @wuwx #3 楼 @shiny #5 楼 @tylerlong #6 楼 @jasl #7 楼 @ericguo

补充一下,比如我需要每四秒去获取一个 BTC 价格的信息,这种情况就不能用 Rack 了,因为他初始化就要十秒多。

对于这种情况我想看看大家有没有什么更好的方法

#11 楼 @kevinzhow Rake?初始化用了 10 多秒?怎么会这么慢

看你的描述没有严格要求必须是间隔 4 秒,这就很简单了,写个 daemon 进程,抓一次,抓取时间设置个合理的 timeout,然后 sleep 4 秒。

#11 楼 @kevinzhow 写个 rake,开启自运行后不再退出,定时抓取调度也用 ruby 写

#8 楼 @kgen 我知道楼主说的是执行 rake 时间太长了,所以建议用定时任务行一个 ruby 脚本,去插入一条队列,让 sidekiq(或其他) 去处理。

#12 楼 @xstmjh require 环境 前提是 task :foo => :environment

whenever sidetiq

crontab 的缺点:

  • 时间要设置合理,要保证安全退出,否则可能同时开过个
  • 难管理,用 whenever 就好很多

建议:

  • deamon + god

@quakewang 一样

用 daemon 只要初始化一次,为了维护方便还要加上 god。

#11 楼 @kevinzhow 我在 node 里面对这种用法是监听 http 然后 crond 定时发起任务,另一种是 node 自带的 setTimeout 来定时发起任务。通过 http 接口调试可能会更方便一点。 是 btc 的话还要考虑失败/超时带来的延时,维护一个队列比较妥当?

resque + crontab(whenever)

resque 能解决避免同时打开多个任务的问题,并且解决了需要多次加载的问题

Resque scheduler

需要 登录 后方可回复, 如果你还没有账号请 注册新账号