关于N Service Bus消息失败重发及DivideByZero异常修复后重发的问询
NServiceBus消息重试相关问题解答
咱们先拆解第一个问题:当消息在NServiceBus中发送失败后,我们是否会再次收到该消息?
这个得分两种核心场景来看:
- 发送阶段失败:比如服务没法连接到消息队列服务器、目标队列不存在这类情况。默认情况下NServiceBus会自动重试发送操作,重试的次数和间隔是可以按需配置的。如果所有重试都宣告失败,这条消息会被放到**错误队列(error queue)**里,不会自动重新发送到目标队列,得等你手动修复底层问题后,把消息从错误队列移回原队列才能再次触发处理。
- 接收端处理失败:如果消息成功发送到队列,但接收方处理时出了错,NServiceBus默认有两层重试机制:先做几次即时重试(Immediate Retries)——也就是短时间内快速重试;如果还是失败,就进入延迟重试(Delayed Retries)——每隔一段时间再重试一次。要是所有重试都没搞定,消息同样会被移到错误队列暂存。
再来说第二个问题:若出现DivideByZero异常(此类异常需通过代码修复解决),在代码修复完成后,系统是否会尝试重新发送同一条消息?
默认情况下是不会自动重发的。因为DivideByZero属于代码逻辑错误,当这个异常触发后,经过NServiceBus的所有重试次数后,这条消息就会被转移到错误队列里“躺平”。NServiceBus不会自动监测你的代码有没有修复,也不会主动把消息从错误队列拉回来重新处理。
等你把代码里的除以零问题修复好之后,需要手动干预:要么直接把错误队列里的这条消息移回原接收队列,要么用NServiceBus的ServiceControl工具来重新提交这条消息,这样修复后的服务就能接收到这条消息并正确处理了。
当然,你也可以通过自定义异常策略调整重试行为,但对于这种必须代码修复才能解决的异常,手动触发重发是最稳妥的方式。
内容的提问来源于stack exchange,提问作者Amar Srivastava
相关产品推荐
相关产品推荐

