【问题标题】:What is RabbitMQ clustering ?什么是 RabbitMQ 集群?
【发布时间】:2025-12-10 15:35:01
【问题描述】:

我在我的ruby项目中使用RabbitMQ(AMQP)已经有一段时间了,反正我只是听说过RabbitMQ集群,任何人都可以简单介绍一下,我需要知道运行普通RabbitMQ服务器的区别和 RabbitMQ 集群,我为什么需要它以及如何实现它。

我需要我的解决方案具有可扩展性并处理如此多的请求,我正在考虑以下实现,我很想知道如何实现这样的事情:

HA proxy->3 Clustered RabbitMQ instances

处理请求的最快方式和最佳 ruby​​ Web 服务器选择是什么,只需解析它并将其发送到适当的队列。

在我当前的实现中,我正在使用瘦服务器并执行以下操作,但正在寻找更快且更具可扩展性的更好架构:

require "bunny"
require "thin"


@amqp ||= Bunny.new(:logging => false)
@amqp.start

@direct_exchange ||= @amqp.exchange('') 

app = Proc.new do |env|
  req = Rack::Request.new(env).params

  command = req['command'].strip rescue "no command"
  number  = req['number'].strip  rescue "no number"

  if command =~ /\A(create|c|r|register)\z/i      
    @direct_exchange.publish(number, :key => "create") 

  elsif command =~ /\A(update|u)\z/i
    @direct_exchange.publish(number , :key => "refresh") 

  end    

  [200, {'Content-Type' => "text/plain"} , command ]  

end

Rack::Handler::Thin.run(app, :Port => 4001)

我确信有更好的实现。

任何帮助/提示将不胜感激。

提前致谢

【问题讨论】:

    标签: ruby rabbitmq amqp


    【解决方案1】:

    这完全取决于您的真正瓶颈在哪里,以及您期望的可靠性水平。但作为一般经验法则,您可能有:

    • http 负载平衡器平衡对多个 Web 服务器的 http 请求
    • N 个 Web 服务器处理 http 请求,解析它们并最终将命令发布到 RabbitMQ 节点
    • 由 M 个 rabbit 节点组成的 RabbitMQ 集群
    • K 个工作节点,使用来自 rabbit 集群的消息并执行命令

    现在 http 服务器的数量可以与 RabbitMQ 节点不同。这取决于你的瓶颈在哪里。也许您只需要一个 RabbitMQ 节点(因此不需要集群),或者其中几个。例如,如果有 2 个,那么一半的 http 服务器将连接到一个 rabbitmq 节点,一半连接到另一个。无论它们连接到哪个,它们都可以发布到同一个 amqp 交换,并且 rabbtimq 集群将负责处理 2 个节点并收集发布到该交换的所有内容,同时连接到节点 http 服务器的 ragradless。

    同样的逻辑也适用于“workers”,即服务器消费来自 rabbitmq 的消息,并在其中执行命令。根据他们需要做的工作量,可以有 1 到 K 个。您还可以将它们均匀地连接到现有的 rabbitMQ 服务器。

    【讨论】:

    • 感谢 Davorin 的解释,但我没有得到关于 RabbitMQ 节点的部分,我应该为每个 HTTP 服务器获取新节点吗?有没有简单的演示文稿或教程来说明这一点?谢谢
    • 嗨,我已经扩展了我的回答,以澄清您在评论中提出的问题。