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