网络寻租

Programmer, Gamer, Hacker

Resque介绍和分析

| Comments

image

resque

resque是ruby on rails下面的一个异步工作分配框架, 它利用redis的队列功能, 来达到异步处理工作的目的. 好处在于使用简便以及很容易和rails整合.

项目地址在 https://github.com/defunkt/resque, 如何使用里面写的很清楚, 这里就不多说了. 具体逻辑也没有什么好说的, 无非是需要调用任务了, 塞任务到队列里面, 然后worker取队列, 然后把任务做掉.

一些细节:

resque是如何enque的?

1
redis.rpush "queue:#{queue}", encode(item)

presistance如何做?

1
encode: MultiJson.decode(object)

resque是如何取work的?

1
decode redis.lpop("queue:#{queue}")

resque-scheduler

resque-scheduler是基于resque的一个计划任务插件, 简单地说, 就是能够利用它来做一些定时和定时循环的任务. 项目主页: https://github.com/bvandenbos/resque-scheduler, 使用方法我也不多说了. 项目主页上都有.

resque-scheduler计划的队列如何处理?

1
2
3
4
5
6
7
# First add this item to the list for this timestamp
redis.rpush("delayed:#{timestamp.to_i}", encode(item))

# Now, add this timestamp to the zsets.  The score and the value are
# the same since we'll be querying by timestamp, and we don't have
# anything else to store.
redis.zadd :delayed_queue_schedule, timestamp.to_i, timestamp.to_i

竟然根据每个timestamp做了一个队列.. 计划任务都保存到一个sorted set里面.

scheduler如何检查是否有新的任务?

核心在于这段代码:

1
2
3
4
5
6
7
8
9
10
if timestamp = Resque.next_delayed_timestamp(at_time)
  enqueue_delayed_items_for_timestamp(timestamp)

resque_scheduler.rb:

def next_delayed_timestamp(at_time=nil)
  items = redis.zrangebyscore :delayed_queue_schedule, '-inf', (at_time || Time.now).to_i, :limit => [0, 1]
  timestamp = items.nil? ? nil : Array(items).first
  timestamp.to_i unless timestamp.nil?
end

enqueue_delayed_items_for_timestamp比较复杂, 就不贴了.

结论

基本上resque的逻辑很直观, 和想象中的一样. resque-scheduler就不一样了. 复杂很多.

我学习他们的示例代码放在: https://bitbucket.org/linjunhalida/code-example/src/tip/ruby/resque/

Comments