Azure Service Bus触发器有时不触发

时间:2019-03-17 19:37:16

标签: azure azureservicebus azure-servicebus-queues

我创建了功能app v1,其中包含一个功能。该功能是服务总线触发器。

将其发布到Azure之后,我看到了这种奇怪的行为。 有时,该函数被触发,有时却未被触发。当时日志中没有错误,但是我看到邮件被放入死信队列,并且出现“传递计数已排除”错误。

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

这是我发送消息的方式:

var client = new QueueClient(connectionString, queueName);
var bytes = Encoding.UTF8.GetBytes(msgStr);
var message = new Message(bytes);
await queueClient.SendAsync(message);
  • 在本地运行功能时看不到此问题。
  • 每15-20分钟收到一次新邮件(<5)
  • 我正在使用消费计划
  • host.json为空

请帮助。

1 个答案:

答案 0 :(得分:1)

冷启动

根据消耗计划,如果功能应用处于空闲状态,则会在10-15分钟后进入睡眠状态。任何即将到来的触发器都会唤醒您的功能应用程序,这可能需要几秒钟的时间,即冷启动。

我认为的问题

在您看来,当您的服务总线尝试传递消息时,您共享的统计信息表明该功能应用正在休眠并且无法传递消息,因为它无法传递消息。当您重新启动功能应用程序时,您的功能应用程序实例将被显式预热,并且能够处理该窗口的消息,但是在空闲时间之后它将再次进入睡眠状态。

可能的解决方案

保持实例预热

始终让您的功能应用程序热身。您可以简单地创建另一个时间触发函数,该函数每隔5分钟左右点击一次服务总线触发函数(正在处理消息的函数),它将使实例始终保持运行状态。

增加重试次数

您需要检查重试次数并增加计数,以便功能应用唤醒时,服务总线仍能够传递消息。

使用应用服务计划

另一种方法是使用应用程序服务计划而不是消费计划。这将使功能应用程序始终保持预热状态以处理消息。考虑到您的工作量(<5),这可能是有点昂贵的选择,因为在消费计划中,您每月可以获得100万要求。