假设我有一个Job Scheduler,它有4个消费者A,B,C和D.类型X的作业必须被路由到消费者A,类型Y到消费者B,依此类推。消费者A,B,C和D作为独立应用程序运行,无需任何依赖,无论是本地还是远程。
消费者需要不同的时间来完成他们的工作,这些工作随后被路由到Job Scheduler进行聚合。
也可能需要其中一位消费者的克隆来分享其符合条件的工作。但是,作业只能处理一次。
基于内容的路由器是否是最佳解决方案?请注意,我需要自定义作业调度程序,因为它只具有在消费者中分配工作的智能。
或者有更好的方法来处理这个问题吗?我不要求代理的那些功能像自动切换到另一个消费者(负载平衡),如果发生故障。
答案 0 :(得分:1)
我不完全确定我会关注你。这听起来像是一个非常直接的异步处理场景。
我不确定您打算如何将这些作业发送到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");
请重温您的问题以获得更好的答案:)