在Apache Camel中的集群:多个JVM使用同一个CamelContext

5
我有一个应用程序需要在集群上部署,根据环境,集群可能会有2个或4个JVM。该应用程序有相同的CamelContext,我们将其部署在所有JVM上。因此,所有JVM都具有相同的路由。对于FTP路由,这很好,因为它使其具有竞争力,并且只有一个JVM获取文件。然而,在使用基于计时器的操作从数据库中提取数据时,我发现所有JVM都读取相同的记录并执行相同的任务。我的要求是,如果一个路由选择了它,其他路由就不应该再尝试。我尝试通过Google寻找解决方法,但没有找到最佳方法。是否有任何默认的camel组件支持此功能?我阅读了Camel文档中关于集群负载均衡的内容,但没有帮助。JGroups和ZooKeeper是特定类型的集群。任何帮助将不胜感激。

Camel源代码中有一个集群示例:camel/examples/camel-example-spring-boot-clustered-route-controller。 - Constantino Cronemberger
2个回答

9

首先,不同部署的Camel上下文将作为独立的应用程序运行,彼此之间没有任何了解。

如果您有多个路由从相同的源消费,则其行为取决于组件。

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

我想最后一个是您的主要问题。可以通过几种方式来完成。它们可能有点棘手设置,但应该可以胜任工作。

  • 一个集群化的Quartz调度程序。通常需要共享数据库。 阅读这里如何配置 Camel中的quartz。然后您需要配置quartz.properites和集群属性(JDBC或其他)。这在这里有记录。
  • 您可以使用ZooKeeper和路由策略运行单个路由(从您部署的Camel实例中选举出来)。然后,您可以使用该路由并在出现问题时故障转移到另一条路由,或者使用该单个路由发出触发器,使用计时器或石英钟来轮询,这些轮询可以分发到所有camel实例。

0

我这里有一个问题,假设我们在文件组件上使用簇模式的quartz。

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

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

注意:我的文件路由配置使用并行处理true
< from uri="file:xxx">
<camel:split streaming="true" parallelProcessing="true">


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