NServiceBus升级7版本后端点间歇性停止处理消息问题咨询
问题背景
将NServiceBus版本升级至7后,对应服务端点出现间歇性停止消息处理的现象,排查运行日志时发现存在如下记录:
Replication destinations cleared for url http://RavendbURL/databases/XXXBusDB. Failover servers count: 0
答复
1. 该日志的产生原因
这条日志由NServiceBus使用的RavenDB持久化客户端输出,触发场景主要有三类:
- RavenDB客户端首次初始化连接、或者网络闪断后重连时,会主动拉取当前绑定数据库的复制拓扑与故障转移节点列表,如果数据库本身没有配置任何故障转移副本,就会输出这条日志,标记当前可用的故障节点数为0
- 客户端之前缓存过故障转移节点列表,但重连校验时发现所有缓存的故障节点均不可访问(比如节点下线、网络策略变更拦截了访问、账号权限不足无法读取拓扑配置),就会清空本地缓存的复制目标地址,输出这条日志
- NServiceBus 7默认搭配的RavenDB客户端版本比老版本高,新版本默认开启了复制拓扑的周期性校验逻辑,老版本客户端不会输出这类信息级日志,所以升级后才会看到这条记录,不代表这个状态是升级后才出现的。
2. 该日志对应的状态是否会导致端点停止消息处理
这条日志本身属于信息级别日志,不是错误记录,不会直接触发端点停止消息处理,但它背后的连接异常确实会导致你观测到的停摆现象:
- 当客户端清空所有复制目标地址后,如果和RavenDB主节点的连接也存在异常,NServiceBus的持久化层会进入完全不可用状态:既无法连接主库,也没有故障节点可以切换,此时消息入队、分布式事务提交、消息去重校验、超时管理等所有依赖RavenDB的操作都会被阻塞
- NServiceBus 7内置了端点健康保护机制,当持久化层持续处于不可用状态时,会自动暂停从消息队列拉取新消息,直到持久化连接恢复,对外就表现为间歇性停止消息处理
- 如果你部署的是单节点RavenDB,本身就没有配置故障转移集群,那日志里
Failover servers count: 0属于完全正常的状态,此时出现消息处理停摆的根因是主库连接不稳定:比如服务和RavenDB之间存在网络闪断、RavenDB实例资源(CPU、内存、磁盘IO)耗尽导致请求超时、升级后客户端连接参数(超时时间、最大连接数、认证配置)和服务端不匹配,和这条日志本身没有直接关系。
快速排查方向
- 先对齐日志时间点,查RavenDB服务端的运行日志,确认对应时间点有没有请求超时、连接数打满、资源耗尽的异常
- 核对升级后的NServiceBus配置中,RavenDB连接字符串、超时参数、认证信息是否和升级前一致,有没有遗漏配置项
- 单节点部署场景下,可以直接关闭RavenDB客户端的自动复制拓扑拉取功能,减少不必要的重连校验带来的连接抖动。
内容的提问来源于stack exchange,提问作者Brijesh
相关产品推荐
相关产品推荐

