Apache Camel与ActiveMQ集群化

11
我正在尝试确定对我的ServiceMix 3.3.1/Camel 2.1/AMQ 5.3应用程序进行集群的选项。我正在执行高容量消息处理,并且需要进行集群以实现高可用性和水平扩展。
以下是我的应用程序基本功能...HTTP-> QUEUE-> PROCESS-> DATABASE-> TOPIC

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

from("activemq:inboundQueue?maxConcurrentConsumers=50") .process(decode()) .process(transform()) .process(validate()) .process(saveToDatabase()) .to("activemq:topic:ouboundTopic");

所以,我已经阅读了所有ServiceMix和AcitveMQ集群页面,但仍然不确定应该选择哪种方式。

我知道我可以使用主/从设置进行高可用性,但这并不能帮助扩展性。

我已经了解了代理网络,但不确定如何应用。例如,如果我在集群中的多个节点上部署相同的Camel路由,它们将如何“交互”?如果我将我的HTTP生产者指向一个节点(NodeA),哪些消息将被发送到NodeB?队列/主题是否在节点A/B之间共享...如果是,消息是如何分割或复制的?此外,外部客户端如何订阅我的“outboundTopic”(并获取所有消息等)?

另外,我一直在考虑是否应该在多个ServiceMix实例之间共享代理。这样做会更简洁,因为只需要管理一组队列/主题,并且可以通过添加更多实例来扩展。但是,现在我受限于单个代理的可扩展性,而且又回到了单点故障的问题...

如果有人能为我澄清这些折衷方案...我将不胜感激。

1个回答

10

在使用ServiceMix/Camel/ActiveMQ时,有多种扩展策略可供选择。由于每个软件都提供了众多选项,因此可以根据应用程序需要扩展的部分选择不同的路径。以下是一些高级策略:

  • 增加入站Jetty实例的数量 - 这需要启动更多的Web服务器实例,并将请求负载均衡到多个实例或公开多个URL并将所有请求发送到ActiveMQ的同一入站队列。

  • 增加ActiveMQ实例的数量 - 通过启动其他ActiveMQ实例并将它们组成网络,您正在创建经纪人网络。某些圈子称之为分布式队列,因为给定队列可以在网络中的所有代理商中提供。但是,如果要启动多个ActiveMQ实例,则应考虑启动额外的ServiceMix实例。

  • 增加ServiceMix实例的数量 - 每个ServiceMix实例嵌入一个ActiveMQ实例。通过增加ServiceMix实例的数量,不仅可以增加ActiveMQ实例的数量(可以将其联网以形成经纪人网络),而且还可以在这些ServiceMix实例中部署更多的应用程序副本。如果需要增加ActiveMQ或ServiceMix实例的数量,则可以为每个实例部署具有适当数量并发消费者的消费应用程序。消息不会被拆分或复制,而是根据消费者需求以循环方式分配给队列上的所有消费者,无论它们位于何处。即,如果网络中的一个ActiveMQ实例没有消费者,则不会在其队列实例上有任何消息可供消费。这导致我最后一个建议,增加轮询入站队列的消费者数量。

  • 增加入站队列上的JMS消费者 - 这可能是最简单、最强大且最可管理的方式来提高吞吐量。它是最简单的,因为您可以部署消费应用程序的附加实例,让它们竞争来自入站队列的消息(无论它们是针对本地队列还是通过经纪人网络分布的队列)。这可能仅仅需要增加并发消费者的数量,或者更进一步,将包含消费者的应用程序部分拆分,并将其部署到许多ServiceMix实例中。它是最强大的,因为通常不难扩展事件驱动应用程序,而增加消费者数量一直是完成此目标的方法。它是最可管理的,因为您可以更改应用程序的打包方式,使得消费应用程序完全分离,从而具备分布式能力。

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

    希望这些信息能够帮助您开始朝着一个或多个方向前进,这取决于您实际需要扩展应用程序的哪个部分。如果您有任何问题,请让我知道。

    Bruce


    Bruce,谢谢。我一直在使用“maxConcurrentConsumers”属性来将入站队列的消费者多线程。现在我正在尝试迈出下一步,将负载分布到多台机器上。因此,听起来我可以设置多个相同的SMX实例,在经纪人网络中进行配置,这将满足我的需求。在经纪人网络中,MessageGroups是否仍然提供线程亲和性?另外,我需要使outboundTopic消息对门户可用...门户需要连接到每个经纪人才能获取所有消息吗? - Ben ODay
    我不相信消息组在经纪人网络中提供排他性。总排序仅适用于单个经纪人,因此我认为消息组也是如此。只要所有消息都发送到出站主题,那么所有消息都应该被消耗,无论订阅在哪个经纪人注册。由于它是一个主题,您也可以使用持久订阅。虽然我不确定单个具有持久订阅的消费者是否是一个好主意,因为您正在使用多个并发消费者从入站队列中拉取消息。 - bsnyder
    @bsnyder - 很好的总结; 您建议我在哪里获取最新的ServiceMix文档?网站上的官方文档已经过时了。 - wulfgarpro
    是的,这个网站已经有些过时了。据我所知,获取更好的文档的最佳途径是从我几年前帮助创立的一家公司获得的,现在该公司被称为FuseSource(http://fusesource.com/products/enterprise-servicemix/#documentation)。 - bsnyder

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接