首页ruby

消息队列 delayed_job 的使用精解

hfpp2012发布于51 次阅读

1. 介绍

delayed_job是跟sidekiq一样的ruby编写的消息队列的系统,不过跟sidekiq一个很大的不同,在于sidekiq是使用redis来作为存储介质的,而delayed_job是使用PostgreSQL,Mysql,Sqlite,或者Mongodb这样的数据库来作为存储系统的。sidekiq的原理是不断地读取(brpop)sidekiq中的数据,delayed_job也是一样,不过它读取的是表中的队列数据,所以是需要创建一张表来放队列的信息的。

2. 安装

添加下面一行到Gemfile文件中:

gem 'delayed_job_active_record'

创建存放队列的表:

$ rails generate delayed_job:active_record
$ rake db:migrate

输出如下:

create  bin/delayed_job
chmod  bin/delayed_job
create  db/migrate/20160103071229_create_delayed_jobs.rb

其中bin/delayed_job是用来启动delayed_job这个进程的。

而创建的表的名称为delayed_jobs,我们来查看一下它的结构:

3. 使用

我们和activejob结合来使用delayed_job。

config/application.rb文件中设置queue_adapter

config.active_job.queue_adapter = :delayed_job
config.eager_load_paths << Rails.root.join('app/jobs')

先来创建一个job。

$ rails generate job update_article_visit_count

app/jobs/update_article_visit_count_job.rb的内容如下:

class UpdateArticleVisitCountJob < ActiveJob::Base
  queue_as :default

  def perform(article_id)
    # Do something later
    logger.info 'update article visit count begin'
    @article = Article.find(article_id)
    @article.visit_count += 1
    @article.save!(validate: false)
    logger.info 'update article visit count end'
  end

end

我们现在开启rails console来测试一下。

article = Article.first
UpdateArticleVisitCountJob.perform_later article.id

它产生的内容大体上是这样的:

现在我们准备开启delayed_job这个进程来消费这条队列,不过在开启之前,我们先把日志打开。

创建这个文件config/initializers/delayed_job_config.rb,内容如下:

Delayed::Worker.logger = Logger.new(File.join(Rails.root, 'log', 'delayed_job.log'))

然后我们监听日志的情况:

$ touch log/delayed_job.log
$ tail -f log/delayed_job.log
$ bin/delayed_job start

可能会报错,只要把下面这行添加到Gemfile文件中就好了:

gem 'daemons'

因为delayed_job是以后台的形式开启的,它是利用了daemons的功能来实现后台进程的。

成功执行的日志大体是这样的:

一成功,数据表delayed_job相关的数据也会被删除掉的。

如果执行失败,比如在job内有异常抛出或发生错误。

delayed_job会不断地retry,且数据库中的记录也是不会被删除掉的。

4. 高级选项

下面介绍delayed_job在使用上的高级功能。

4.1 delay和handle_asynchronously方法

跟sidekiq一样,加上delay或handle_asynchronously方法就可以不用生成job或worker,就可以让你原来的方法使用消息队列。

4.2 参数

每个Job分别可以指定三个参数:priorityrun_atqueue

这三个参数都是delayed_jobs表的列。

priority是指队列的优先级,run_at是指队列的运行时间,queue是指队列的名称,默认为default

4.3 其他选项

比如指定最大的retry次数,队列最长的运行时间等。

Delayed::Worker.destroy_failed_jobs = false
Delayed::Worker.sleep_delay = 60
Delayed::Worker.max_attempts = 3
Delayed::Worker.max_run_time = 5.minutes
Delayed::Worker.read_ahead = 10
Delayed::Worker.default_queue_name = 'default'
Delayed::Worker.delay_jobs = !Rails.env.test?
Delayed::Worker.raise_signal_exceptions = :term

5. 相关的gem

下面会简单介绍三个gem:

delayed_job_recurring是一个能让delayed_job使用类似cron功能的gem,也就是可以不结合cron,轻易地直接利用数据库来实现任务计划的功能。

delayed_job_web和delayed-web两个gem是相关于delayed_job的web端的任务查看监控页面。delayed_job_web的功能多一些,delayed-web简洁很多。

完结。

本站文章均为原创内容,如需转载请注明出处,谢谢。

0 条回复
暂无回复~~
喜欢

© Rails365 | 隐私条款 | 服务条款 | 粤ICP备15004902号 | 在线学员:24

Top