ruby + AMQP : processing queue in parallel

标签 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 条消息并并行处理它们,不是吗?

最佳答案

预取是在您确认之前可以提前发送给您的最大消息数。

换句话说,预取大小不限制向客户端传输单个消息,只限制在客户端仍有一条或多条未确认消息的情况下提前发送更多消息。 (来自 AMPQ 文档)

QoS Prefetching Messages

RabbitMQ AMQP Reference

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

另请参阅 Hot Bunnies,一种基于 RabbitMQ Java 客户端的快速 DSL:

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

(感谢来自 Google 网上论坛的 Michael Klishin 和来自 blogger 的 stoyan 的信息)

关于 ruby + AMQP : processing queue in parallel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10768850/

相关文章:

ruby-on-rails - 自定义 ActiveModel full_messages

ruby - 使用 Mechanize gem 登录

ruby-on-rails - 在文本编辑器上运行 ruby​​ 服务器时出错

elasticsearch - 如何在Logstash中使用过滤器设置1:N工作流程?

java - 使用来自 Apache Qpid java 客户端的 RabbitMQ 服务器消息?哪个版本?

ruby-on-rails - 在 Windows 7 上安装 ImageMagick 和 rmagick

ruby-on-rails - 我应该如何将 ID 传递到收集 route ?

c# - .NET 中的消息代理服务器 (CoreCLR/DNX)

javascript - 从 C++ 向网站发送数据

来自 Vertx 和 AMQPBridge 的 Java 运行时警告