You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 11:09:12