Apache Camel中的群集:多个JVM相同的CamelContext

时间:2014-09-26 18:25:27

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

我在群集上部署了一个应用程序。根据环境,群集可能有2个或4个JVM。 该应用程序具有与我们在所有JVM上部署的相同的CamelContext。因此,所有JVM都具有相同的路由。对于FTP路由,这很好,因为它使它具有竞争力,只有1个JVM获取文件。 但是,在使用基于计时器的操作从DB中获取时,我看到所有JVM都读取相同的记录集并执行相同的工作。 我想要的是,如果一条路线捡起来,其他路线不应该尝试。 我试着谷歌搜索这个。但是,找不到最好的方法。 是否有支持此功能的默认camel组件? 我在Camel文档中阅读了clusteringload balancing,但它没有帮助。 JGroups和ZooKeeper特定于集群类型。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:7)

首先,不同部署的Camel上下文将充当彼此不了解的独立应用程序。

如果您有多条路线从同一来源消耗,则该行为与组件有关。

  • 文件/ FTP等通常具有文件锁定机制,以避免多个消费者阅读同一文件。
  • 消息队列(JMS / AMQP / etc)内置了消息处理功能,除非您使用的是主题 - 然后每个实例都会获得一份副本。
  • 数据库和其他可轮询组件可能需要您使用仅从一个节点生成的某种信号来触发轮询。

我猜最后一个是你的主要问题。它可以通过几种方式完成。设置起来可能有点棘手,但应该做好。

  • 集群Quartz调度程序。通常需要要共享的数据库。 请在此处阅读如何配置quartz in Camel。然后,您需要配置quartz.properites和集群属性(JDBC或诸如此类)。那是documented here
  • 您可以使用ZooKeeper and route policies运行单个路由(在已部署的Camel实例中选择)。然后你可以使用该路由并在出现问题时故障转移到其他路由,或使用该单一路由发出触发器,使用timer或quartz来轮询可以分发给所有camel实例。

答案 1 :(得分:0)

我在这里有一个问题,假设我们在文件组件上使用集群模式的石英。

故障转移:实例1(JVM1)读取文件并将数据插入表中。

           如果我的工作在工作中失败怎么办? 。在这种情况下,Instance2(JVM2)将获取相同的文件并插入表。我如何告诉camel从文件中读取未处理的数据,否则将在表中创建重复的条目,除非对表有约束。

注意:我的文件路由配置使用并行处理真实 <来自uri =“file:xxx”>
< camel:split streaming =“true”parallelProcessing =“true”>