Apache Camel路由处理IBM MQ消息出现严重延迟问题排查
问题排查:IBM MQ队列监听器消息拾取延迟问题
问题背景
我们有一款用于模拟微服务跨端点交互的测试工具,其中一个模拟服务是基于Apache Camel路由构建的IBM MQ队列监听器。该服务收到消息后会生成3个关联响应并发送回响应队列,单条消息正常处理仅需10-20毫秒。
在性能测试中,我们向应用注入消息,由应用与该模拟服务交互。当前每秒约60条消息的负载并不算高,但从应用日志来看,消息在请求队列中等待被模拟服务拾取的时间过长,直接导致性能下降。
我们已部署6个作为ECS任务的测试工具实例,每个实例的并发消费者数从最初的1依次调整到3、10、20,但消息拾取延迟的改善效果并不明显,需要排查问题根源。
消息消费采用非XA事务型,并使用Spring的CachingConnectionFactory包装MQQueueConnectionFactory,会话缓存大小设置为500。
更新补充信息
Apache Camel路由定义
from("jms:my.request.queue?concurrentConsumers=20&disableReplyTo=true") .routeId("my-stub") .autoStartup(true) .policy(somePlatformTransactionPolicy) .process(...) // 一系列内存内处理的processor .to("jms.my.response.queue")
底层组件说明
Apache Camel JMS组件底层使用Spring JmsTemplate发送消息,使用Spring MessageListenerContainer消费消息。经确认,实际使用的是Spring DefaultMessageListenerContainer的扩展类DefaultJmsMessageListenerContainer,该类继承自AbstractPollingMessageListenerContainer,基于轮询机制工作,相关实现代码如下:
/** * 默认的{@link DefaultMessageListenerContainer 容器},用于监听JMS目标的消息。 * <p/> * 该实现扩展了Spring的{@link DefaultMessageListenerContainer},支持自动恢复和流量控制。 */ public class DefaultJmsMessageListenerContainer extends DefaultMessageListenerContainer {
内容的提问来源于stack exchange,提问作者Julian
相关产品推荐
相关产品推荐

