Apache Camel/ActiveMQ 优先级路由

3

我有两个AMQ队列拥有相同的消费者。 第一个队列(Q1)处理了97%的消息,而另一个队列(Q2)只有3%。 问题是,需要尽快处理Q2中排队的消息。 当Q2中有可用的消息时,我需要暂停第一个路由以取代它的消费者。 Apache Camel路由如下:

<route id="q1">
    <from uri="jms:recordAnalysisRequests" />
    <to uri="bean:analysisService" />
</route>
<route id="q2">
    <from uri="jms:recordAnalysisRequestsFastTrack" />
    <to uri="bean:analysisService" />
</route>

应该使用什么策略? 我认为不能使用重排机制,因为Q1可能有数千个消息排队,而我无法将所有消息都适配到重排批处理中。 我正在研究路由限制,但是我不知道如何实现。 此外,我想知道是否可以通过zookeeper节点进行同步。如果这种解决方案可行,我需要一些指导。


请注意,标签是独立的。也就是说,您不能将多个标签组合成一个单一的概念。[apache][camel]这两个标签在一起并不等同于单个的[apache-camel]标签。在选择标签时,请务必仔细阅读出现的描述! - Charles
1个回答

3

您可以将所有消息放置在单个队列中,并使用消息优先级。有关详细信息,请访问http://activemq.apache.org/how-can-i-support-priority-queues.html

第二个选项是使用Camel Resequencer。

<route id="q1">
    <from uri="jms:recordAnalysisRequests" />
    <setHeader headerName="CustomPriority">
       <constant>2</constant>       
    </setHeader>
    <to uri="direct:analysisDirect" />
</route>
<route id="q2">
    <from uri="jms:recordAnalysisRequestsFastTrack" />
    <setHeader headerName="CustomPriority">
       <constant>1</constant>       
    </setHeader>
    <to uri="direct:analysisDirect" />
</route>
<route id="q3">
    <from uri="direct:analysisDirect">
    <resequence>
        <header>CustomPriority</header>
        <to uri="bean:analysisService" />
    </resequence>
</route>

第三种选择(Camel 2.12),不使用重新排序器,而是使用带有优先级阻塞队列的SEDA端点。https://camel.apache.org/seda.html#SEDA-ChoosingBlockingQueueimplementation


我遇到了慢消费者和可能有很多非优先消息在Q1的情况:“请注意,这种权衡可能会对性能产生重大影响,因此您必须彻底测试您的场景。” 因此,性能是我的关注点。 - biliboc

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