2012-05-26 59 views
4

由於我的大部分任務都依賴於網絡,因此我希望並行處理隊列,而不是一次處理一條消息。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條消息,並行處理它們,不是嗎?

+0

費爾南多,在我看來,joelparkerhenderson的答案在下面很有用。它有助於解決您的問題嗎?讓我們知道任何一種方式。 –

回答

2

預取是可以在您確認之前預先發送給您的最大消息數。

換句話說,預取大小並不限制單個消息到客戶端的傳輸,只有在客戶端仍然有一個或多個未被確認的消息時才提前發送更多的消息。 (來自AMPQ文檔)

QoS Prefetching Messages

RabbitMQ AMQP Reference

EventMachine的是基於單線程和事件。對於不同線程或進程上的並行作業,請參閱EM :: Deferrable,然後Thread或spawn。

另見熱兔子,在RabbitMQ的Java客戶端頂部的快速DSL:

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

(感謝您在谷歌網上論壇邁克爾Klishin信息,和斯托揚在博客)

+0

你知道如何讓Ruby amqp並行處理隊列任務嗎? – Fernando

+0

更新瞭如何進行並行處理的答案 – joelparkerhenderson