如何使用AMQP gem在Ruby中扩展RabbitMQ使用者?
我阅读了文档,并提出了一些(貌似)可行的方法 在一个微不足道的例子中。这些示例水平缩放。新流程连接起来 到代理并接收消息的子集。从那里每个过程都可以 启动多个消费者线程。它使用低级别的消费者界面 在文档中描述。
以下是代码:
require 'amqp'
workers = ARGV[1] || 4
puts "Running #{workers} workers"
AMQP.start do |amqp|
channel = AMQP::Channel.new
channel.on_error do |conn, ex|
raise ex.reply_text
end
exchange = channel.fanout 'scaling.test', durable: true, prefetch: 1
queue = channel.queue("worker_queue", auto_delete: true).bind(exchange)
workers.times do |i|
consumer = AMQP::Consumer.new channel, queue, "consumer-#{i}", exclusive = false, manual_ack = false
consumer.consume.on_delivery do |meta, payload|
meta.ack
puts "Consumer #{consumer.consumer_tag} in #{Process.pid} got #{payload}"
end
end
trap('SIGTERM') do
amqp.start { EM.stop }
end
end
有一些我不确定的事情:
:prefetch
选项应该是什么?我认为一个人会是最好的。答案 0 :(得分:1)
对于像RabbitMQ这样的经纪人,documentation实际上涵盖了大部分内容,但回答了你的问题:
对于工作人员队列,您最有可能想要直接交换,即将消息(作业)准确地路由到一个工作人员,而不是同时将多个工作人员路由到多个工作人员。但这可能会根据您的工作而改变。根据定义,扇出应该将相同的消息路由到多个消费者。
此次安装时,预取应为1
。一般来说,这要求代理用1
消息填充消费者的网络缓冲区,直到确认为止。另一种设置是您有1名消费者和n
名工作人员,在这种情况下,您可以将预取设置为n
。此外,值得注意的是,在这种设置中,您不应该在完成工作之后才开始工作。
负载均衡基本上是消费者之间的循环。这就是你顺序看到一切的原因。如果每项工作花费不同的时间,您将看到分布发生变化。
我希望有所帮助。我暂时没有对Ruby AMQP库做任何事情 - 我们重写了所有workers in Go。