2010-02-08 107 views
10

我想确定我的选项为集群我的ServiceMix 3.3.1 /骆驼2.1/AMQ 5.3应用程序。我正在执行大容量消息处理,并且需要进行群集以实现高可用性和横向可伸缩性。阿帕奇骆驼与ActiveMQ集群

这基本上是我的应用程序做什么......基于HTTP> QUEUE->流程 - >数据库 - >从( “码头:http://0.0.0.0/inbound ”)主题

。要(“ ActiveMQ的:inboundQueue”);

从( “ActiveMQ的:inboundQueue maxConcurrentConsumers = 50”) .process(解码()) .process(变换()) .process(验证()) .process(saveToDatabase()) 。以( “ActiveMQ的:主题:ouboundTopic”);

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

我知道我可以使用HA的主/从设置,但这对于可伸缩性没有帮助。

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

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

如果任何人都可以澄清我的权衡......我会很感激。

回答

9

当您使用ServiceMix/Camel/ActiveMQ时,有多种策略可以扩展。因为每个软件都提供了很多选项,所以您可以根据应用程序的哪些部分需要扩展来选择不同的路径。下面是一些策略,高水平的列表:

  • 增加入境码头实例的数量 - 这需要跨越多个实例启动web服务器的多个实例,要么负载均衡请求或暴露多个网址和发送所有对ActiveMQ中相同入站队列的请求。

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

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

  • 增加入站队列中JMS使用者的数量 - 这可能是增加吞吐量的最简单,最强大和最易于管理的方式。这是最简单的,因为您正在部署额外的消费应用程序实例,以便它们竞争来自入站队列的消息(不管它们是否争用本地队列或通过经纪人网络分发的队列)。这可能就像增加并发消费者的数量一样简单,或者通过拆分包含消费者的应用程序部分并将其部署到ServiceMix的许多实例来进行更多的介入。这是最强大的,因为它通常不是很困难,扩展事件驱动的应用程序总是通过增加消费者数量来完成的。这是最容易管理的,因为你有能力改变你的应用程序的打包方式,这样消费应用程序就完全独立,并具有分布的能力。

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

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

布鲁斯

+0

布鲁斯,谢谢。我一直在使用“maxConcurrentConsumers”属性来对来自入站队列的消费者进行多线程处理。 现在我正在尝试下一步并将负载分布到多台机器上。 因此,这听起来像我可以设置多个相同的SMX实例在经纪人网络中配置,并将负载分配给我的需要。 消息组仍然提供线程与代理网络的亲和力吗? 此外,我需要使outboundTopic消息可用于门户......门户网站是否需要连接到每个代理,然后获取所有消息? – 2010-02-09 17:29:32

+0

我不相信消息群体会在经纪人网络中提供排他性。总订购一次只适用于一个经纪人,所以我认为这些消息组是一样的。 只要所有消息都发送到出站主题,则应该消费所有消息,而不管订阅注册的是哪个代理。由于这是一个主题,您也可以使用持久订阅。虽然我不确定持久订阅的单个消费者是否是个好主意,因为您正在使用多个并发消费者从入站队列中提取消息。 – bsnyder 2010-03-03 00:21:40

+0

@bsnyder - 不错的总结;您会在哪里建议我获得最新的ServiceMix文档?网站上的官方文档已经过时了。 – wulfgarpro 2011-08-19 06:34:05