【问题标题】:Switching from ActiveMQ to RabbitMQ从 ActiveMQ 切换到 RabbitMQ
【发布时间】:2011-10-26 00:40:09
【问题描述】:

我目前正在使用 ActiveMQ 来满足我的消息传递需求;除了一些数据库故障之外,它运行良好。但是,我至少在考虑试用 RabbitMQ。但在此之前,我想了解以下内容:

  1. RabbitMQ 与 ActiveMQ 有何不同? RabbitMQ 在哪些方面比 ActiveMQ 做得更好或更差?
  2. 相比之下,配置 RabbitMQ 的难易程度如何?
  3. RabbitMQ 与 Spring 的集成度如何?
    • 使用 ActiveMQ,我只需将连接工厂 bean 连接到 JmsTemplate 并使用 DefaultMessageListener bean 将队列连接到它们各自的处理程序。我可以对 RabbitMQ 做同样的事情吗?

【问题讨论】:

标签: activemq rabbitmq amqp


【解决方案1】:
  1. RabbitMQ 是一个 AMQP 代理,而 ActiveMQ 是一个 JMS 代理。我建议您阅读 the AMQP wikipedia article 以了解 AMQP 中使用的概念,这些概念与您在 JMS 中熟悉的概念不同。主要区别之一是,在 AMQP 中,生产者在不知道实际消息分发策略的情况下发送到交换器,而在 JMS 中,生产者以队列或主题为目标(因此知道适当的消息路由类型)。所以很难说什么做得更好或更坏,因为 JMS 和 AMQP 之间的语义非常不同。

  2. RabbitMQ 的队列和交换都是通过 AMQP 协议配置的,因此客户端库允许您配置所有目标及其行为。 ActiveMQ 需要特定的目标配置,因为 JMS 规范不涵盖任何管理方面。除此之外,RabbitMQ 的系统配置是 Erlang-esque,而 ActiveMQ 通常以 XML 配置。所以你必须习惯 {tuple} 和 可爱的语法。 RabbitMQ通常与 OS 包一起安装,而 ActiveMQ 发行版是您放置在任何地方的存档(或您嵌入到其他东西中的 Maven deps)。

  3. 很好:) 见Spring AMQP

【讨论】:

【解决方案2】:

AMQP 是面向消息中间件 (MOM) 的应用级标准。 JMS 是用于与 MOM 通信的 Java 标准 API。

使用 JMS 的两个不同 Java 应用程序可能使用不同的 MOM,因此仍然无法通信。 ActiveMQ 是一个带有 JMS 库的 MOM 系统,它允许 Java 程序使用 JMS 访问它,但它不一定使用 WebLogic MOM 与另一个 JMS Java 程序进行通信。

不同的 AMQP MOM 系统可以相互操作(假设它们使用相同版本的 AMQP),因为 AMQP 是一个与 SMTP 类似的标准。 AMQP MOM 系统没有理由不能同时为其 Java 客户端提供 JMS 库。例如,SwiftMQ 提供 JMS API 并使用 AMQP 1.0。

不幸的是,并不是所有的 AMQP 系统(而且有很多)都在使用 1.0 版的 AMQP。 RabbitMQ(在撰写本文时)尚未提供 AMQP 1.0 支持。其他一些 AMQP 系统是 Apache QPID 和 StormMQ,但还有许多其他系统。一旦所有这些都支持 AMQP 1.0,那么它们应该都可以相互操作。

在他们的网站http://activemq.apache.org/amqp.html 上,ActiveMQ 说,“我们希望 ActiveMQ 在完成后实施最新版本。但是,此时,ActiveMQ 不实施 AMQP。”现在 AMQP 1.0 已经发布,ActiveMQ 没有进一步说明他们何时会支持它。

【讨论】:

    【解决方案3】:

    由于 RabbitMQ 是一个 AMQP 代理,其配置主要通过 AMQP 本身处理,因此您的大多数问题都没有任何意义。

    RabbitMQ 的一个棘手问题是许多操作系统包的版本为 1.72,这可悲的是已经过时了。直接从他们的站点获取 RabbitMQ 2.51 的 .deb 或 .rpm 包会更好。之后,您真正需要在 AMQP 之外进行的唯一配置是使用 rabbitmqctl 创建虚拟主机和用户权限。或者,您可以下载 Web 管理控制台的 .ez 插件,并将它们放在正确的目录中,然后再重新启动 RabbitMQ。如果您使用的是 2.51,强烈建议使用此 Web 管理控制台,但如果您坚持使用 Debian 和 Ubuntu 为您提供的默认 1.72,则不可能。

    一旦你运行了 RabbitMQ,你就可以使用任何语言和任何 AMQP 库。我亲自接管了一个使用 pika、amqplib 和 kombu 的 Python 系统。现在我正在使用 haigha 和 Scala 的 Java 库,它们都通过 AMQP(当然还有 MQ 代理)相互通信。

    【讨论】:

      【解决方案4】:

      比较JMS/AMQP的概念来比较ActiveMQ和RabbitMQ并不是最重要的:ActiveMQ讲AMQP,商业版有RabbitMQ的JMS客户端(以前叫vFabric RabbitMQ)。然而,一些 AMQP 概念(路由键)可能在某些用例中很有用。

      我都用过,而且都喜欢:

      • 发现 Erlang+RabbitMQ 在某些系统(过时的软件包存储库)上比 Java+ActiveMQ 更难安装
      • RabbitMQ 有一些不错的集群/HA 选项(镜像队列、集群联合)。不需要共享 ZooKeeper 或共享数据库,但应该注意“脑裂”问题。
      • ActiveMQ 比较重(内存消耗)
      • ActiveMQ 与 Apache Camel 完美集成,使用 RabbitMQ 最好使用 Spring Integration(Camel RabbitMQ/AMQP 有点粗糙)
      • ActiveMQ支持XA事务,可以嵌入Java应用,可以嵌入Camel。
      • 使用 ActiveMQ 进行 Java 自动化测试更容易(嵌入式代理)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-13
        • 2018-04-02
        • 2015-11-17
        • 2020-07-11
        • 1970-01-01
        相关资源
        最近更新 更多