Azure 服务总线触发器有时不触发

Azure Service Bus trigger not firing sometimes

我创建了函数应用程序 v1,其中包含一个函数。该函数是一个服务总线触发器。

将它发布到 Azure 后,我看到了这种奇怪的行为。 有时该功能会被触发,有时不会。当时日志中没有错误,但我看到消息被放入死信队列并出现 "delivery count excided" 错误。

现在,如果我尝试重新发送失败的消息 - 它再次失败。但是,如果我转到门户网站,刷新功能应用程序并再次发送消息 - 它们会像往常一样被接收和处理。

这是我发送消息的方式:

var client = new QueueClient(connectionString, queueName);
var bytes = Encoding.UTF8.GetBytes(msgStr);
var message = new Message(bytes);
await queueClient.SendAsync(message);

请帮忙。

冷启动

在消耗计划中,如果函数应用处于空闲状态,它会在 10-15 分钟后进入休眠状态。任何即将到来的触发器都会唤醒您的函数应用程序,这可能需要几秒钟,称为冷启动。

我认为的问题

在我看来,当您的服务总线尝试传递消息时,查看您分享的统计信息功能应用程序正在休眠并且考虑到消息传递失败而无法传递。当您重新启动您的函数应用程序时,您的函数应用程序实例会显式预热并且能够处理该消息 window 但它会在空闲期后再次进入休眠状态。

可能的解决方案

保持实例预热

让您的函数应用始终处于预热状态。您可以简单地创建另一个时间触发函数,它会每隔 5 分钟左右持续触发您的服务总线触发函数(处理消息的函数),它将一直保持实例 运行。

增加重试次数

您需要检查重试次数并增加到更大的次数,以便当功能应用程序唤醒时服务总线仍然能够传递消息。

使用应用服务计划

另一种方法是使用应用服务计划而不是消费计划。这将使函数应用程序始终处于预热状态以处理消息。考虑到您的工作量 (<5),这可能是一个有点贵的选择,因为在消费计划中您可以免费获得 100 万 req/month。