【问题标题】:Apache Camel and load balancingApache Camel 和负载均衡
【发布时间】:2013-06-27 08:55:28
【问题描述】:

我们计划使用 Camel 在一些外部系统(FTP、SOAP-WS、REST-WS、主题、队列等)之间进行集成。

我们可能会使用 Spring 配置(Camel 上下文 XML),由于信息量很大,我们计划将其部署到 Tomcat 集群。

我没有找到任何文档,如果它是一种可能的配置,并且如果两个应用程序(假设它是两个 tomcat 一开始)可以干扰。

更新

在使用 Camel 三年后,它似乎在某些情况下得到了很好的管理:“JMS”和 Web 服务,负载平衡在这些情况下运行良好,但在“JMS”的情况下,我们松散了顺序如果我们不使用标头JMSXGroupID 的消息。

但是,对于从文件(或 FTP、sFTP、FTPS)消费的服务,问题仍然存在。目前我们只激活一条腿来从这个来源消费,万一这条腿坏了,不幸的是,在第二条腿中没有自动开始使用 FTP 文件的路线。

【问题讨论】:

    标签: apache-camel cluster-computing load-balancing producer-consumer


    【解决方案1】:

    只要您不写入 HTTP 会话,您就不必关心任何事情 - 只需将一些 Tomcat 节点放在负载均衡器后面。如果您写入 HTTP 会话,这仍然很简单,但您可能已经(取决于选择的配置)配置会话复制。

    我一直在处理两个类似的系统集成项目,这些项目在繁重的请求负载下工作。作为部署环境,我们选择了位于 Apache 服务器(通过 AJP 连接器通信)和 BigIP 负载均衡器(一段时间后我们切换到 Nginx)后面的集群 Tomcat 实例。

    这两个应用程序都接受了 HTTP 请求。其中一个是完全无状态的(类似代理),另一个必须保留一些特定于会话的信息。对于后者,我们必须确保放入会话的所有对象都是可序列化的并配置会话复制。

    我们做了很多测试,最终得到了久经考验的 DeltaManager,没有粘性会话和同步复制模式。根据您的系统架构,您需要非常仔细地考虑这一点,但有一个very good documentation 可以提供帮助。

    我们没有使用粘性会话,因为每个请求都包含要完成的大量处理。根据我们所做的测试和请求的性质,对我们来说,最好是循环处理而不是针对特定的客户端会话再次访问同一台服务器。同样由于没有启用粘性会话,我们使用同步复制来确保所有节点在响应传递给客户端之前接收到完整的会话(它只阻止单个请求,所以不用担心)。我们没有在会话中存储大量对象(只是一些基本信息),因此默认情况下会话被复制到所有节点没有问题。但是,如果您发现它是一个瓶颈,您可以改进配置,将一些节点子集放入集群中。

    【讨论】:

    • 我认为即使没有传入请求(http),也必须构建两个节点,以便如果它们“使用”相同的源(文件系统、数据库),我们必须实现一些锁定机制,否则两个节点消耗相同“事件”的风险很大。我想知道 Camel 内部是否有考虑到这一点的内置机制。
    • 对不起 - 我没有在你的问题中找到 ftp 选项。好吧,正如已经针对基于 HTTP 协议的通信(REST、SOAP)所述,没有问题(使用负载平衡器)。对于拾取文件的工作,我不知道任何开箱即用的解决方案。不仅在 Camel 中,而且在 Spring Integration 或 Spring Batch 中。我认为您需要自己创建生产者并将集群实例用作消费者,例如通过 JMS 队列将消息传递给他们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2016-06-10
    • 2017-06-12
    相关资源
    最近更新 更多