如何获取Azure Service Bus Topic消息投递次数以实现重试逻辑
Azure Service Bus 基于投递次数实现重试逻辑的相关问题解答
1. Microsoft.Azure 相关包是否提供获取消息投递次数的方法?
官方提供的Azure Service Bus SDK原生支持获取该计数,无需额外引入第三方包或自行实现计数逻辑:
- 如果你使用的是新版SDK
Azure.Messaging.ServiceBus,接收到的ServiceBusReceivedMessage对象直接暴露DeliveryCount属性,读取即可拿到当前消息的累计投递次数,计数从1开始,消息第一次被投递时值为1,每次投递失败回退到订阅后再次投递时计数自动+1。 - 如果你使用的是旧版SDK
Microsoft.Azure.ServiceBus,可以通过Message.SystemProperties.DeliveryCount拿到相同的计数值。
2. 是否需要对C# Service Bus订阅客户端做特殊配置才能拿到该信息?
不需要任何额外配置。DeliveryCount是Service Bus Broker自动附带的系统属性,和你使用的接收模式(PeekLock/ReceiveAndDelete)无关,只要是通过官方客户端正常从订阅拉取的消息,默认就会携带该值,不需要你手动开启客户端开关、也不需要在发送消息时自定义属性传递。注意不要尝试从消息的自定义属性字典中查找该值,直接读取SDK暴露的对应系统属性即可。
3. 是否需要对主题/订阅本身做配置调整?
主题本身不需要做任何配置调整,默认创建的主题就支持投递次数自动计数能力。
如果要配合自定义重试逻辑使用,建议你调整对应订阅的MaxDeliveryCount参数:
- 该参数是订阅级配置,默认值为10,代表当消息投递次数累计到该阈值后,系统会自动将消息移入死信队列,不再投递给普通消费者。
- 如果你自定义的重试阈值小于默认的10次,不需要修改该配置;如果你需要的重试次数大于10次,需要将该参数调整为大于等于你预期的最大重试次数,避免消息还没达到你设定的重试阈值就被系统自动转入死信。
参考实现代码
// 基于Azure.Messaging.ServiceBus SDK的重试逻辑示例 var client = new ServiceBusClient(connectionString); var processor = client.CreateProcessor("your-topic-name", "your-subscription-name"); processor.ProcessMessageAsync += async args => { int currentDeliveryCount = args.Message.DeliveryCount; const int maxRetryTimes = 3; if (currentDeliveryCount <= maxRetryTimes) { // 执行你的业务重试逻辑 await ProcessBusinessWithRetryAsync(args.Message); await args.CompleteMessageAsync(args.Message); } else { // 超过重试阈值,转入死信或做降级处理 await args.DeadLetterMessageAsync(args.Message, reason: "Exceed max retry count"); } }; // 启动处理器 await processor.StartProcessingAsync();
内容的提问来源于stack exchange,提问作者Spartan 117
相关产品推荐
相关产品推荐

