使用bunny fetch从RabbitMQ加载多条消息

时间:2015-11-10 18:16:23

标签: ruby rabbitmq amqp eventmachine bunny

我正在为RabbitMQ构建一个Ruby工作器,它将每次处理多个消息并将在多个队列上工作。 在RabbitMQ中我有:Queue1,Queue2,Queue3 ......

我需要快速加载大包数据包(使用basic_get我可以加载65535条消息而无需询问)。下面的代码工作得很好,直到我们转移到新的服务器。队列和工作程序之间的延迟时间上升,我只能使用基本get来加载每秒50条消息。

这是我的工作流程:get:

def work_iteration
  cache = queue_manager.messages
  size = cache.size
  return if size == 0
  delivery_tag = process(cache)
  queue_manager.ack(delivery_tag)
  size
end

在QueueManager.rb中我有

def messages
  MULTIPLE_MESSAGES.times.reduce([]) do |s, _|
    result = basic_get
    break s if result.nil? || result.last.nil?
    s << result
  end
end

def ack(delivery_tag)
  channel.ack(delivery_tag, true)
end

我发现的另一个解决方法是使用subscribe方法。但我还没有办法打破内循环的订阅。

queue_manager.subscribe do |delivery_info, properties, payload|
  cache << [delivery_info, properties, payload]
  if cache.size >= 65_000
    dt = process(cache)
    queue_manager.ack(dt)
  end
end

我用Google搜索,发现这对我有用:

length = queue.size
cache = [] 
consumer = queue.subscribe(block: false) do |delivery_info, properties, payload|
  cache << [delivery_info, properties, payload]
  if cache.size >= length
    dt = process(cache)
    queue.ack(dt)
    consumer.cancel
  end
end
  • 但主线程会发生什么呢?
  • 如何正确阻止主线程,并在处理完成后取消阻止?
  • 还有其他方法可以从队列加载多条消息,处理它们,关闭消费者并移动到下一个队列吗?

0 个答案:

没有答案