Solace技术咨询:无订阅者消息丢弃信息获取与跨区通信异常排查
Solace 问题排查指南
问题1:如何获取因主题无订阅者被丢弃的直接消息信息?
直接消息因无匹配订阅被丢弃是Solace部署中很常见的场景,你可以通过以下几种方式获取相关信息:
- 启用丢弃消息日志:通过Solace CLI登录设备,执行
message-spool log-discarded-messages enable开启全局丢弃消息日志;如果只想针对特定VPN,用message-vpn <你的VPN名称> log-discarded-messages enable。之后在设备日志(默认路径/var/log/solace/)里就能找到标记为No Subscription Match的丢弃记录,里面包含消息主题、丢弃时间、来源客户端等细节。 - 查看监控统计指标:
- 全局层面:执行
show message-spool statistics,找到Direct Messages Discarded - No Match字段,这是所有VPN累计的无匹配直接消息丢弃数。 - VPN层面:执行
show message-vpn <你的VPN名称> statistics,同样能找到对应VPN的丢弃计数,更精准。
- 全局层面:执行
- 启用消息追踪:如果需要单条消息的完整路径,在VPN级别开启消息追踪:
message-vpn <你的VPN名称> message-trace enable,然后配置追踪规则过滤无匹配的直接消息(比如message-vpn <VPN名称> message-trace filter add discard-reason "No Subscription Match")。之后通过show message-vpn <VPN名称> message-trace records就能看到每条被丢弃消息的详细信息,包括来源、主题、丢弃时刻等。
问题2:MNR架构下客户端回复消息无法送达服务器的排查步骤
这种跨MNR节点的消息投递问题,核心要围绕订阅同步、消息转发、两端配置三个维度排查:
第一步:验证MNR订阅同步是否正常
服务器在应用区节点订阅的returned/status主题,必须同步到DMZ节点,客户端发布的消息才能被路由到应用区。
- 检查订阅同步状态:在两台Solace设备上分别执行
show message-vpn <你的VPN名称> multi-node redundancy subscription-sync status,确认Subscription Sync State是In Sync,没有同步延迟或失败的记录。 - 检查DMZ节点是否存在服务器的订阅:在DMZ节点执行
show message-vpn <你的VPN名称> subscriptions,搜索returned/status,如果能看到标记为remote的订阅(来自应用区节点),说明同步正常;如果没有,那订阅没传过来,大概率是MNR配置问题:- 确认两个节点的VPN都开启了订阅同步:
message-vpn <VPN名称> multi-node redundancy subscription-sync enable - 检查两台MNR节点之间的网络连通性,确保MNR专用端口(默认55555)能双向通信,没有防火墙拦截。
- 确认两个节点的VPN都开启了订阅同步:
第二步:检查消息路由与投递链路
如果订阅同步正常,那就要看消息从客户端到服务器的路径是否通顺:
- 确认客户端发布的消息被DMZ节点接收:在DMZ节点开启丢弃日志或消息追踪,看客户端发布的
returned/status消息有没有被接收,有没有被标记为无订阅丢弃(如果订阅同步正常的话不应该出现这个情况)。 - 检查跨节点消息转发统计:在应用区节点执行
show message-vpn <VPN名称> multi-node redundancy message-routing statistics,查看Messages Received from Remote Node计数是否有增长,对应客户端发布的消息数量;如果计数没变化,说明消息没从DMZ节点转发过来,可能是MNR消息路由没开启,执行message-vpn <VPN名称> multi-node redundancy message-routing enable开启。
第三步:排查两端客户端/服务器的配置细节
- 服务器JCSMP订阅检查:
- 确认订阅的主题
returned/status完全匹配客户端发布的主题,没有通配符或拼写错误。 - 如果是持久订阅(比如用了
JCSMPFactory.createDurableTopicSubscription),要确认持久订阅在MNR节点间的同步配置是否开启:message-vpn <VPN名称> multi-node redundancy persistent-subscription-sync enable。 - 在应用区节点执行
show message-vpn <VPN名称> subscriptions local,确认服务器的订阅已成功注册。
- 确认订阅的主题
- 客户端MQTT发布检查:
- 确认发布的主题和服务器订阅的主题完全一致,MQTT的主题区分大小写,也要注意层级分隔符(
/)的使用。 - 检查发布的QoS级别:如果是QoS 1/2,确认DMZ节点是否正确处理并转发了确认消息,避免因为ACK超时导致消息重发或丢失。
- 确认发布的主题和服务器订阅的主题完全一致,MQTT的主题区分大小写,也要注意层级分隔符(
- ACL与权限检查:确认两个节点的VPN ACL都允许
returned/status主题的发布和订阅操作,没有阻止跨节点的消息转发规则。
内容的提问来源于stack exchange,提问作者Koon Sang
相关产品推荐
相关产品推荐

