Ruby + AMQP:并行处理队列

时间:2012-05-26 18:41:25

标签: ruby amqp

由于我的大多数任务都依赖于网络,因此我希望并行处理队列,而不是一次只处理一条消息。

所以,我正在使用以下代码:

#!/usr/bin/env ruby
# encoding: utf-8

require "rubygems"
require 'amqp'

EventMachine.run do
  connection = AMQP.connect(:host => '127.0.0.1')

  channel  = AMQP::Channel.new(connection)
  channel.prefetch 5

  queue    = channel.queue("pending_checks", :durable => true)
  exchange = channel.direct('', :durable => true)

  queue.subscribe(:ack => true) do |metadata, payload|
    time = rand(3..9)
    puts 'waiting ' + time.to_s + ' for message ' + payload
    sleep(time)

    puts 'done with '+ payoad

    metadata.ack
  end
end

为什么不使用我的预取设置?我想它应该得到5条消息并且并行处理它们,不是吗?

1 个答案:

答案 0 :(得分:2)

预取是您在确认之前可能提前发送给您的最大邮件数。

换句话说,预取大小不限制单个消息到客户端的传输,只是在客户端仍然有一个或多个未确认消息时发送更多消息。 (来自AMPQ文档)

QoS Prefetching Messages

RabbitMQ AMQP Reference

EventMachine是单线程和基于事件的。对于不同线程或进程上的并行作业,请参阅EM :: Deferrable,然后是Thread或spawn。

另请参阅Hot Bunnies,这是RabbitMQ Java客户端上的快速DSL:

https://github.com/ruby-amqp/hot_bunnies

(感谢Michael Klishin在Google网上论坛上提供的信息,感谢stoyan on blogger)