activemq - Apache Camel 与 ActiveMQ 集群

标签 activemq cluster-computing apache-camel

我正在尝试确定集群 ServiceMix 3.3.1/Camel 2.1/AMQ 5.3 应用程序的选项。我正在执行大量消息处理,我需要集群以获得高可用性和水平可扩展性。

这基本上是我的应用程序所做的...HTTP->QUEUE->PROCESS->DATABASE->TOPIC

from("码头:http://0.0.0.0/inbound")
.to("activemq:inboundQueue");

from("activemq:inboundQueue?maxConcurrentConsumers=50")
.process(解码())
.process(transform())
.process(验证())
.process(saveToDatabase())
.to("activemq:topic:ouboundTopic");

所以,我已经阅读了所有 ServiceMix 和 AcitveMQ 集群页面,但我仍然不确定要走哪条路。

我知道我可以为 HA 使用主/从设置,但这对可扩展性没有帮助。

我已经阅读了有关经纪人网络的信息,但不确定这如何适用。例如,如果我在集群中的多个节点上部署相同的 Camel 路由,它们将如何准确地“交互”?如果我将我的 HTTP 生产者指向一个节点 (NodeA),哪些消息将被发送到 NodeB?队列/主题是否会在节点 A/B 之间共享……如果是这样,消息是拆分还是重复?此外,外部客户端将如何准确订阅我的“outboundTopic”(并获取所有消息等)?

或者,我一直在想我应该在多个 ServiceMix 实例之间共享一个代理。这会更清晰,因为只有一组队列/主题需要管理,我可以通过添加更多实例来扩展。但是,现在我仅限于单个代理的可扩展性,而且我又回到了单点故障......

如果有人可以为我澄清权衡……我会很感激。

最佳答案

当您使用 ServiceMix/Camel/ActiveMQ 时,有多种扩展策略。由于每个软件都提供了如此多的选项,因此您可以根据应用程序的哪个部分需要扩展而采取多种途径。以下是一些策略的高级列表:

  • 增加入站 Jetty 实例的数量 - 这需要启动更多的 Web 服务器实例,或者跨多个实例负载平衡请求,或者公开多个 URL 并将所有请求发送到 ActiveMQ 中的同一个入站队列。
  • 增加 ActiveMQ 实例的数量 - 通过启动额外的 ActiveMQ 实例并将它们连接在一起,您正在创建一个代理网络。在某些圈子中,这被称为分布式队列,因为可以使给定的队列跨网络中的所有代理可用。但是,如果您要启动多个 ActiveMQ 实例,您应该只考虑启动额外的 ServiceMix 实例。
  • 增加 ServiceMix 实例的数量 - 每个 ServiceMix 实例都嵌入一个 ActiveMQ 实例。通过增加 ServiceMix 实例的数量,您不仅可以增加 ActiveMQ 实例的数量(它们可以联网形成一个代理网络),而且您还能够在这些 ServiceMix 实例之间部署更多的应用程序副本.如果您需要增加 ActiveMQ 或 ServiceMix 实例的数量,那么您可以为每个实例部署一个具有适当数量的并发消费者的消费应用程序。消息不会被拆分或复制,它们会根据消费者需求以循环方式分发给队列中的所有消费者,无论它们位于何处。即,如果网络中的一个 ActiveMQ 实例没有消费者,它的队列实例上将不会有任何消息被消费。这引出了我的最后一个建议,即增加轮询入站队列的消费者数量。
  • 增加入站队列中 JMS 使用者的数量 - 这可能是增加吞吐量的最简单、最强大和最易于管理的方法。这是最简单的,因为您正在部署消费应用程序的其他实例,以便它们竞争来自入站队列的消息(无论它们是竞争本地队列还是通过代理网络分发的队列)。这可能就像增加并发消费者的数量一样简单,或者通过拆分包含消费者的应用程序部分并将其部署到 ServiceMix 的许多实例来更多地涉及。它是最强大的,因为它通常并不困难,而且扩展事件驱动的应用程序总是通过增加消费者的数量来完成的。它是最易于管理的,因为您可以更改应用程序的打包方式,从而使消费应用程序完全独立,从而能够进行分发。

  • 最后一条建议是扩展应用程序的最强大方法。只要传入的 HTTP 端点可以处理大量流量,您可能只需要增加入站队列上的使用者。这样做的一个重要原因是消费者或他们移交给的 bean 正在执行所有繁重的工作,主要的处理和验证量。通常,这个过程最终需要最多的资源。

    希望这提供了您开始朝着一个方向或几个方向前进所需的信息,具体取决于您实际需要扩展的应用程序的哪个部分。如果您有任何问题,请告诉我。

    布鲁斯

    关于activemq - Apache Camel 与 ActiveMQ 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225761/

    相关文章:

    Hadoop 客户端和集群分离

    hadoop - YARN Mapreduce作业中的AccessControlException

    python - 是否有用于与MS Cluster交互的python软件包?

    java - 跟踪多个 Camel 上下文

    mysql - 如何防止mysql数据库中出现重复数据

    java - 无法在 JMS 中正确创建消息选择器

    java - activemq 和 Glassfish : InactivityIOException: Channel was inactive for too long

    java - 如何禁用ActiveMQ中的InactivityMonitor日志?

    activemq - 无法在 Linux 上启动 Active MQ

    java - 如何解决java.lang.NoClassDefFoundError : com/google/api/client/repackaged/com/google/common/base/Strings