用Resque做异步处理

在开发应用的时候,对于一些比较耗时且没必要立即得到结果的操作(比如大的文件写入或者邮件发送之类的)一般通过做异步处理来减少等待时间和资源占用。之前看过一些类似于RabbitMQ的工具,虽然很强大,但是感觉太复杂了,在做的时候逻辑比较复杂,维护起来也比较麻烦,总的来说,易用性不是太强。本来我就比较懒,特别是接触过Rails之后就变得更懒了,所以除非必要情况下,对这种复杂的工具从来没啥好感。这也是为啥今天要特别介绍一下Resque。

Resque是Github团队开发的一个基于redis的可以将任务放在后台执行的ruby库,可以很方便的投递任务然后让任务排队去运行。一般的异步任务队列有投递、队列、worker和任务这几个部分,而Resque将这几块做的足够的简单方便易于使用,比如创建一个任务,只需要在class里面加一个perform方法:

class Archive

  @queue = :file_serve

  def self.perform(repo_id, branch = 'master')

    repo = Repository.find(repo_id)

    repo.create_archive(branch)

  end

end

 

其中@queue是用来指定使用的队列名称,self.perform就是这个任务真正的执行体。

那么如何投递一个任务呢?也很简单,只要一行代码

Resque.enqueue(Archive, id, branch)

 

投递时只要提供要执行的任务以及需要的参数就可以了,也就是说,在不需要修改自己应用结构的前提下,很简单的完成了异步队列的所有功能(在也是Github团队开发Resque时的目标之一)。

当然创建worker也是相当简单的,Resque提供了用现成的Rakefile,执行一个命令就搞定:

QUEUE=* rake resque:work

 

通常是需要在自己应用的环境下来执行任务的,也很简单,比如rails的:

QUEUE=* rake environment resque:work

 

Resque还有一个比较易用的地方是提供了一个方便的操作界面,如下图所示:

resque在这里可以很方便的看到有多少队列和worker在运行,还可以看到共执行了多少任务,有多少正在执行,有多少失败了,失败的原因是什么,还可以 重新启动 失败的任务。

对于rails应用只要在route里面加一行mount Resque::Server.new, :at => "/resque",就可以通过http://your_app_url/resque访问到了。

越来越喜欢ruby和rails的设计思想了,再也不想写php了,虽然现在最熟悉的语言还是php。


转自:http://blog.blankyao.com/story/107.html

你可能感兴趣的:(用Resque做异步处理)