使用Resque运行后台任务

时间:2021-08-03 23:49:22

什么是后台任务?

  默认情况下,程序是按照代码从上到下依次执行的,在前面的任务完成之前,下一个任务是不会开始的。基于这个原理,当用户提交了一个比较耗时的请求时,他只能等待任务完成后才能进行下一步工作。在这个过程中,用户花了时间去做等待的事,这无疑不是好的用户体验,所以我们可以把程序优化成这样:用户仍然是提交一个比较耗时的任务,但我们的程序可以立刻响应,同时告诉用户:“您给我的任务我正在做呢,您先干点其他的吧,等我做好了再告诉您”。这样一来用户的体验明显提升,而Resque就是一个做类似工作的插件。

什么是Resque?

  Resque是一个基于Redis的后台任务处理插件,而Redis是一个key-value的数据存储引擎,因为我们在处理后台任务时可能同时会有很多任务要做,而这些任务就存储在Redis中进行“排队”,决定下一个该进行哪个任务了。所以在使用Resque时,要启动Redis服务才会生效。

安装/启动Redis

  下载Redis源代码(https://github.com/defunkt/resque )后进行编译,然后有个make test的命令可以进行测试,我在自己的电脑上没有测试成功,但仍然不影响使用,所以暂时就没有深究。现在你有两个方法可以启动Redis的server,因为它本身就是一个二进制文件,所以进入src目录下直接./redis-server即可,或者make install装入系统后执行redis-server启动服务。这里(https://github.com/ezmobius/redis-rb)的README有一些关于redis简单的使用方法。

使用Resque

  我们需要把执行后台任务的代码放到一个名叫perform的方法中,同时为该方法所在的class或module定义一个实例变量,示例如下

1
2
3
4
5
6
7
class User
  @queue = :food

  def self.perform(name)
    puts "your name is #{name}"
  end
end

  这里需要注意@queue这个实例变量,它是必不可少并且名字固定。现在我们执行以下命令监听后台任务


rake resque:work QUEUE=food

  这里的QUEUE的值和User的@queue的值相同。

启动console,然后开始调用这个方法

Resque.enqueue(User, 'ilstar')

这时你会发现在执行rake的终端输出了内容。到此为止,我们的小实验已经完成。这个方法的调用其实是异步执行的,读者可以自己添加一些耗时方法以加强效果。

一些问题

   * 这个过程中,你可能会发现你的rake -T中没有包含resque的相关任务,方法如下

1
2
3
4
# in lib/tasks/resque.rake
require 'resque/tasks'

task "resque:setup" => :environment

  * 在执行rake的时候你会被告知需要SystemTimer这个gem,添加进去即可。

  * perform方法是类方法(这个叫法不准确,因为这个方法可以放在class或module中,记得在方法前面加上self.就行了)

  * 这里为啥有个redis-rb?因为Redis是用C语言编写的库,而我们使用的语言是Ruby,所以它的存在就是为了让我们更容易的使用Redis.

  * Resque生效的必要条件:启动redis-server,执行rake resque:work或resque:workers监听。


转自:http://ilstar.blogbus.com/logs/106078692.html