1

假设我有一个 Job Scheduler,它有 4 个消费者 A、B、C 和 D。类型 X 的作业必须路由到消费者 A,类型 Y 到消费者 B,依此类推。消费者 A、B、C 和 D 将作为独立的应用程序运行,没有任何依赖关系,无论是本地还是远程。

消费者需要不同的时间来完成他们的工作,这些工作随后被路由到 Job Scheduler 进行聚合。

可能还需要克隆其中一位消费者来分享其符合条件的工作。然而,一个作业应该只处理一次。

基于内容的路由器是最好的解决方案吗?请注意,我需要自定义作业调度程序,因为它只有在消费者之间分配作业的智能。

或者有没有更好的方法来处理这个?我不需要代理的那些功能,例如自动切换到另一个消费者(负载平衡)以及在失败的情况下。

4

1 回答 1

2

我不完全确定我跟随你。这听起来像是异步处理的一个相当直接的场景。

我不确定您打算如何将这些作业发送到 Camel 应用程序,但如果您可以在某个地方接收它们,您可能会继续使用基于内容的简单路由器。

鉴于您对消费者的要求,我会选择 JMS 队列(使用 Apache ActiveMQ 或类似的代理中间件),每种作业类型一个队列。这使得无需真正更改代码就可以轻松地将消费者分发到不同的机器。

// Central node routes
from("xxx:routeJob")
   .choice()
       .when(header("type").isEqualTo("x"))
           .to("jms:queue:processJobTypeX")
       .when(header("type").isEqualTo("y"))
           .to("jms:queue:processJobTypeY")
       .otherwise()
           .to("jms:queue:processJobTypeZ"); 

 from("jms:queue:aggregateJob")
    .bean(aggregate);

// different camel application (may be duplicated for multiple instances).
from("jms:queue:processJobTypeX")
  .bean(heavyProcessing)
  .to("jms:queue:aggregateJob");

// Yet another camel application
from("jms:queue:processJobTypeY")
  .bean(lightProcessing)
  .to("jms:queue:aggregateJob");

请重新审视您的问题以获得更好的答案:)

于 2012-12-29T17:23:05.637 回答