首页 > 解决方案 > 为什么消息锁过期后Azure Servicebus触发函数立即调用?

问题描述

我有一个带有服务总线绑定的 Azure 函数。服务总线上的Message Lock Duration主题是3 minutesDelivery Count5

有时,即使在第一次触发调用成功完成后,也会触发该函数。没有额外的配置是通过设置hosts.json

我已配置 Application Insights,但跟踪没有意义。第一次调用在 90 秒内完成,但第二次调用在第一次调用的锁定期到期后 3 毫秒触发。

如何确定根本原因?

标签: azureservicebusazure-servicebus-topics

解决方案


我使用您的服务总线订阅的设置。但我无法重现您的问题。

这是我的代码:

using System;
using System.Threading.Tasks;
using System.Threading;
public static void Run(string mySbMsg, ILogger log)
{
    log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg} started.");
    Thread.Sleep(90 * 1000);
    log.LogInformation($"C# ServiceBus topic trigger function processed message: {mySbMsg} ended.");
}

以及我的服务总线订阅的设置:

在此处输入图像描述

我发送了三个消息:test1、test2、test3(此时消息还在订阅中。)。

在此处输入图像描述

大约 90 秒后,我得到:

在此处输入图像描述

在此之后,消息已被删除。

以上是测试结果。

即使从理论上分析,也不应该出现你提到的这种情况。您的锁定时间为 3 分钟,因此大于函数运行时间。而且你还没有改变host.json,所以整个执行应该是这样的:

该函数基于peek方法获取信息(因此该信息在函数结束之前继续存在于服务总线中。),并在您给定的锁定时间内完成逻辑。由于 host.json 没有改变,'extensions.serviceBus.messageHandlerOptions.autoComplete' 的值为'true'。Azure 函数在逻辑完成时自动调用 complete 方法完成信息,并将信息从服务总线中移除。

我怀疑你犯了一个错误。你确定你的函数收到的两条消息是一样的吗?如果是,那么您提供的信息可能不完整,我无法根据您提供的条件重现您的问题。上面函数的全部执行逻辑我都写好了。


推荐阅读