带有 ActiveMQ 集群的 Apache Camel

Posted

技术标签:

【中文标题】带有 ActiveMQ 集群的 Apache Camel【英文标题】:Apache Camel with ActiveMQ clustering 【发布时间】:2011-01-14 14:36:29 【问题描述】:

我正在尝试确定集群 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(saveToDatabase()) .to("activemq:topic:ouboundTopic");

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

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

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

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

如果有人能为我澄清权衡取舍...我将不胜感激。

【问题讨论】:

【参考方案1】:

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

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

增加 ActiveMQ 实例的数量 - 通过启动其他 ActiveMQ 实例并将它们联网在一起,您正在创建代理网络。在某些圈子中,这被称为分布式队列,因为给定的队列可以在网络中的所有代理中可用。但是如果你要启动多个 ActiveMQ 实例,你应该考虑启动更多的 ServiceMix 实例。

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

增加入站队列中 JMS 使用者的数量 - 这可能是增加吞吐量的最简单、最强大且最易于管理的方法。这是最简单的,因为您正在部署消费应用程序的其他实例,以便它们竞争来自入站队列的消息(无论它们是竞争本地队列还是通过代理网络分发的队列)。这可能就像增加并发消费者的数量一样简单,或者通过拆分包含消费者的应用程序部分并将其部署到多个 ServiceMix 实例来增加一些参与度。它是最强大的,因为它通常并不困难,并且扩展事件驱动的应用程序总是通过增加消费者的数量来完成。它是最易于管理的,因为您可以更改应用程序的打包方式,从而使消费应用程序完全独立,从而使其能够分发。

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

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

布鲁斯

【讨论】:

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

以上是关于带有 ActiveMQ 集群的 Apache Camel的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMQ 高可用集群安装配置(ZooKeeper + LevelDB)

activemq集群搭建Demo

分布式ActiveMQ集群

activemq集群的搭建

ActiveMQ学习第五篇:ActiveMq伪集群学习

为什么使用ActiveMQ集群