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

Ruby 使用bunny fetch从RabbitMQ加载多条消息,ruby,rabbitmq,amqp,eventmachine,bunny,Ruby,Rabbitmq,Amqp,Eventmachine,Bunny,我正在为RabbitMQ构建一个Ruby worker,它将每次处理多条消息,并在多个队列上工作。 在RabbitMQ中,我有:队列1、队列2、队列3 我需要快速加载一大包数据包(使用basic_get,我可以不经请求加载65535条消息)。下面的代码工作得很好,直到我们转移到一个新的服务器。队列和工作进程之间的延迟增加,使用基本get,我每秒只能加载50条消息 这是我的get工作流程: def work_iteration cache = queue_manager.messages

我正在为RabbitMQ构建一个Ruby worker,它将每次处理多条消息,并在多个队列上工作。 在RabbitMQ中,我有:队列1、队列2、队列3

我需要快速加载一大包数据包(使用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
def消息
多条消息。时间。减少([])个do_|
结果=基本值
如果结果为0,则中断s?| |结果。最后。零?
s
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
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