4

私のタスクのほとんどはネットワークに依存しているため、一度に 1 つのメッセージだけでなく、キューを並行して処理したいと考えています。

だから、私は次のコードを使用しています:

#!/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 つのメッセージを取得し、それらを並行して処理する必要があると思います。

4

1 に答える 1

2

プリフェッチは、確認応答する前に事前に送信できるメッセージの最大数です。

つまり、プリフェッチ サイズは、クライアントへの単一メッセージの転送を制限するものではなく、クライアントにまだ 1 つ以上の未確認メッセージがある場合に、複数のメッセージを事前に送信することのみを制限します。(AMPQ ドキュメントより)

QoS プリフェッチ メッセージ

RabbitMQ AMQP リファレンス

EventMachine はシングル スレッドで、イベント ベースです。異なるスレッドまたはプロセスでの並列ジョブについては、EM::Deferrable を参照してから、Thread または spawn を参照してください。

また、RabbitMQ Java クライアント上の高速 DSL である Hot Bunnies も参照してください。

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

(Google グループの Michael Klishin とブロガーの stoyan からの情報に感謝します)

于 2012-06-10T01:46:25.050 に答える