Solace队列间歇性消息堆积及未确认消息问题咨询
Solace队列消费问题排查与解决
问题拆解
- 无消息流入时队列仍出现间歇性消息
- 可用监听器存在时消息延迟处理
- 消息堆积时出现未确认消息(unacknowledged messages)
排查与修复建议
1. 间歇性幽灵消息排查
- 检查Solace队列的死信重发机制:若死信队列(DLQ)配置了自动重发规则,过期或被拒消息会周期性回流到主队列,造成“无业务消息时仍有消息流入”的假象
- 确认是否开启队列的消息浏览功能:部分监控工具、调试代码会触发消息浏览操作,这类操作不会移除消息,但可能被误判为新消息流入
- 排查生产者端逻辑:检查是否存在未正确处理的重试逻辑,导致无业务触发时仍有重复消息被发送
2. 消息延迟处理优化
- 调整
DefaultJmsListenerContainerFactory的接收超时参数:默认接收超时可能过长,设置setReceiveTimeout(1000)(毫秒级),让监听器更快响应新消息 - 校验并发配置合理性:
concurrency = "5"需匹配Solace队列的消费者会话数限制,若Solace端限制了会话数量,多余的监听器会处于等待状态,无法及时处理消息 - 关闭批量确认机制:若开启了批量消息确认,消息会积累到一定数量才会被处理,改为单条确认模式(配置
setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE)并在消费完成后手动确认)
3. 未确认消息处理
- 排查消费逻辑的阻塞与异常:若消费代码存在未捕获异常、执行耗时过长的情况,会导致消息长时间处于未确认状态,最终被Solace标记为超时并重发
- 调整Solace队列的未确认消息超时时间:超时设置过短会导致正常处理的消息被误判为超时;设置过长则会堆积未确认消息,需根据业务平均处理时长合理配置
- 优化并发隔离:将固定并发数改为动态范围,比如
concurrency = "3-5",让监听器能根据消息量自动调整并发数,避免固定并发在消息突增时导致资源耗尽、处理停滞
关键配置示例
调整DefaultJmsListenerContainerFactory的核心参数:
@Bean public DefaultJmsListenerContainerFactory solaceJmsListenerContainerFactory(ConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setConcurrency("3-5"); // 动态调整并发范围 factory.setReceiveTimeout(1000); // 缩短接收超时,提升响应速度 factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE); // 客户端手动确认消息 factory.setErrorHandler(t -> { // 统一捕获消费异常,避免监听器挂起 log.error("消息消费异常", t); }); return factory; }
内容的提问来源于stack exchange,提问作者Yogi
相关产品推荐
相关产品推荐

