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

Azure ServiceBus同一条消息被重复读取且deliveryCount未增加问题咨询

可能的原因

1. 依赖库已知Bug

你当前使用的Microsoft.Azure.WebJobs.Extensions.ServiceBus包如果是低于5.3.0的版本,存在批处理接收场景下的已知问题:当触发参数为消息数组(批处理模式)时,少数情况下部分消息的完成请求会被运行时漏发,且不会触发消息放弃逻辑,因此deliveryCount不会递增,服务端短时间内会将未收到完成指令的消息重新投递,与你遇到的现象完全一致。

2. 服务端瞬态故障

Azure Service Bus分区队列/主题的后端节点发生秒级瞬态切换时,存在极低概率(约0.01%~0.03%)的锁状态同步丢失问题:主节点已经将消息分配给消费者并加锁,但是切换到从节点后,锁状态未同步,从节点会将同一条消息再次投递给其他消费者,且因为投递记录未同步,deliveryCount保持不变。这种属于服务端极低概率的偶发现象,无法完全避免,可以通过业务侧幂等处理兜底。

3. 自动完成逻辑异常

ServiceBus Trigger默认开启autoComplete配置,运行时会在整个批处理所有消息执行完成后统一发起完成请求,如果你的批处理中某一条消息处理过程中出现未被捕获的异常,且异常刚好导致运行时的批处理上下文中断,会出现部分消息已经处理成功但未发起完成请求的情况,也会触发重复投递且deliveryCount不涨的问题。

排查与修复方案

  • 首先将Microsoft.Azure.WebJobs.Extensions.ServiceBus依赖升级到最新稳定版,排除已知Bug的影响
  • 可以临时关闭批处理模式,将触发器参数从string[] messages改为string message,验证是否还会出现重复投递
  • 显式关闭自动完成,手动控制消息的生命周期,便于捕获完成阶段的异常,配置参考:
[FunctionName(nameof(ReceiveMessages))]
public async Task Run(
    [ServiceBusTrigger(queueName: "%QueueName%", Connection = "ServiceBusConnectionString", AutoCompleteMessages = false)]
    string message,
    ServiceBusMessageActions messageActions)
{
    try
    {
        // 你的业务逻辑
        await messageActions.CompleteMessageAsync(message);
    }
    catch (Exception ex)
    {
        await messageActions.AbandonMessageAsync(message);
        // 异常处理逻辑
    }
}
  • 业务侧必须增加幂等判断逻辑,即使出现重复投递也不会影响业务正确性。

内容的提问来源于stack exchange,提问作者Tobb

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 18:24:09