Rails 定时任务实现之 sidekiq+sidekiq-cron

image.png

平时的开发中总有一些需要延迟执行的程序和一些需要定时执行的程序。

延迟执行一般我们使用sidekiq,还是挺好用的,也没有什么问题,如果有更多需求可以付费购买PRO版。

定时任务之前我们一直使用sidetiq,但是sidetiq在几年前停止了支持,所以我们要找一个新的替代gem,它就是sidekiq-cron,看名字就知道是专门用来和sidekiq搭配实现定时任务的。

接下来我们就来配置异步执行(sidekiq)和定时执行(sidekiq-cron)的环境。

一、安装Gem包
首先我们先来安装 gem,修改Gemfile文件增加两个gem

Ruby
gem 'sidekiq'
gem 'sidekiq-cron'
然后执行

Bash
bundle install

二、配置 sidekiq
由于sidekiq是基于redis的,所以我们需要给sidekiq配置要使用的redis。

*如果你使用的redis和你的应用在同一台机器,那么你就可以不用配置sidekiq的redis了。

新建一个文件onfig/intializers/sidekiq.rb ,配置如下代码:

Ruby

Server

Sidekiq.configure_server do |config|
config.redis = { url: "redis://172.16.0.40:6379/15"} # 这里的redis根据自己需要修改

# 这里是配置 sidekiq-cron 的定时任务从 config/sidekiq_cron.yml 文件读取
schedule_file = 'config/sidekiq_cron.yml'
if File.exist?(schedule_file)
    Sidekiq::Cron::Job.load_from_hash YAML.load_file(schedule_file)
end

end

Client

Sidekiq.configure_client do |config|
config.redis = { url: "redis://172.16.0.40:6379/15" } # 这里的redis根据自己需要修改
end

接下来是运行时的参数配置文件
config/sidekiq.yml

Ruby

:concurrency: 5 #并发线程数
:pidfile: tmp/pids/sidekiq.pid #进程id
:logfile: log/sidekiq.log # 输出日志文件
staging:
:concurrency: 10
production:
:concurrency: 20
:queues:

  • [critical, 2] # 使用数组的形式写, 第一个参数为打开的 queue 的名称, 第二个为优先级
  • default # 写在队列参数中的, 表示让 sidekiq 处理这个 queue
  • low
    config/sidekiq_cron.yml

Ruby
my_first_work:
cron: "*/1 * * * *" # 每分钟执行一次,这里的配置方式和系统的crontab配置一样
class: "TimeKeyClubWorker"
queue: critcal # 指定要进入的队列,这会覆盖sidekiq_options中指定的queue

三、创建 Worker 类
创建worker

Ruby
rails g sikiq:worker TimeKeyClub
会生成文件 /app/workers/time_key_club_worker.rb
修改代码为如下

Ruby
class TimeKeyClubWorker
include Sidekiq::Worker
sidekiq_options queue: 'critical' #进入指定队列

def perform(*args)
# Do something
Rails.logger.info('time key club worker running !' + Time.now.strftime('%Y-%m-%d %H:%M:%S'))
end
end

四、启动 sidekiq
Bash
bundle exec sidekiq -e production -q default -d # 监控default队列
bundle exec sidekiq -e production -q critical -d # 监控critical队列
bundle exec sidekiq -e production -C config/sidekiq.yml -d # 只监控并执行sidekiq.yml中queues中的队列
启动sidekiq的代码如上,可以看到我们可以只监控并运行其中的一个队列,这样我们就可以把不同的队列跑在不同的服务器上,降低某一台服务器的压力。

启动成功之后我们就可以在日志中看到我们的worker输出的内容了 。

五、注意事项
sidekiq-cron 定时任务的运行时间并不是很精确,如上我们的定时任务,并不是很精确的每60秒执行一次。

sidekiq-cron 如果修改了名字需要运行代码删除原来的定时任务,否则会执行多个定时任务
例如:原来的配置如本文上面的sidekiq_cron.yml
现在把其中的 my_first_work 修改为 my_work ,再次启动sidekiq,我们的worker每分钟会执行两次
删除方法:

Ruby
Sidekiq::Cron::Job.destroy "my_first_work"

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271