2014-02-23 112 views
1

我的项目使用骆驼与Esper component有效率问题。如何提高骆驼的效率?

我有几个外部数据源将信息提供给骆驼端点。每个接收数据的Camel端点将其传输到一个处理它的路由,然后在Esper端点传送它。

下图说明了这种行为:

problem

的效率问题是,所有这一切都是由一个单一的Java线程来完成。因此,如果我有很多来源,那就是一个巨大的瓶颈。

下面的代码准确地说明了这是怎么回事与图像:

public final void configure() throws OperationNotSupportedException{ 
    RouteDefinition route = from("xmpp://localhost:5222/?blablabla..."); 

    // apply some filter 
    FilterDefinition filterDefinition = route.filter().method(...); 

    // apply main processor 
    ExpressionNode expressionNode = filterDefinition.process(...); 


    // set destination 
    expressionNode = filterDefinition.to("esper://session_X"); 
} 

要解决这个问题,我不得不处理与线程池或使用某种并行处理这种情况。我不能使用像多播,收件人列表等模式,因为所有这些发送相同的消息到多个端点/客户端,这是不是在我的例子中的情况。

一种可能的解决办法是具有每每个“数据源端点 - >路线 - >艾斯波端点” 1个螺纹结合,像图像波纹管:

solution_1

另一种可能的解决方案是有1个螺纹接收一切从数据源,然后将其分派到多线程与另一端点一起处理路由处理:

solution_2

PS:我接受任何其他可能的建议。

为了实现这些我都用骆驼SEDA component组件考虑之一,然而,这一次似乎并没有让我有动态线程池,因为concurrentConsumers属性是静态的。此外,我不确定我是否可以使用SEDA端点,因为我相信(虽然我不完全确定)端点(如.to("seda:esper://session_X?concurrentConsumers=10"))的语法对于Camel无效。

所以,在这一点上我很迷茫,我不知道该怎么办: - SEDA是我正在寻找的解决方案吗? - 如果是的话,我该如何将它与Esper端点集成在一起给出语法问题? - 是否有任何其他解决方案/骆驼组件可以解决我的问题?

回答

2

你必须定义一个单独的seda路由中发布你的信息的超能力者引擎,如(使用流利式):

public final void configure() throws OperationNotSupportedException{ 
    from("xmpp://localhost:5222/?blablabla...") 
     .filter().method(...) 
     .process(...) 
     .to("seda:sub"); 

    from("seda:sub?concurrentConsumers=10) 
    .to("esper://session_X"); 
} 

也就是说,seda只应使用,如果丢失的消息不是问题。否则,您应该使用更强大的协议,如允许持久保留消息的jms

编辑:

除了seda,你可以使用threads(),在那里你可以通过定义ExecutorService自定义线程的行为:如果您在使用sedathreads()

public final void configure() throws OperationNotSupportedException{ 
    from("xmpp://localhost:5222/?blablabla...") 
     .filter().method(...) 
     .process(...) 
     .threads() 
     .executorService(Executors.newFixedThreadPool(2)) 
     .to("esper://session_X"); 
} 

,你可能会失去交易在发生故障时的安全性。对于这种情况,或者如果您需要将工作负载平衡到多个远程主机,则可以使用jms。有关此解决方案的更多信息,请参阅here

+0

哦,男孩,谢谢!荣誉++。 但是我有更多的问题。由于使用线程池更好,有没有办法用SEDA组件来做到这一点?那么丢失消息呢?你可以说得更详细点吗? :S –

+1

@Flame_Phoenix我更新了我的答案。 –