我创建了功能app v1,其中包含一个功能。该功能是服务总线触发器。
将其发布到Azure之后,我看到了这种奇怪的行为。 有时,该函数被触发,有时却未被触发。当时日志中没有错误,但是我看到邮件被放入死信队列,并且出现“传递计数已排除”错误。
现在,如果我尝试重新发送失败的消息-再次失败。但是,如果我转到门户网站,请刷新功能应用程序并再次发送消息-它们会像往常一样被拾取和处理。
这是我发送消息的方式:
var client = new QueueClient(connectionString, queueName);
var bytes = Encoding.UTF8.GetBytes(msgStr);
var message = new Message(bytes);
await queueClient.SendAsync(message);
请帮助。
答案 0 :(得分:1)
冷启动
根据消耗计划,如果功能应用处于空闲状态,则会在10-15分钟后进入睡眠状态。任何即将到来的触发器都会唤醒您的功能应用程序,这可能需要几秒钟的时间,即冷启动。
我认为的问题
在您看来,当您的服务总线尝试传递消息时,您共享的统计信息表明该功能应用正在休眠并且无法传递消息,因为它无法传递消息。当您重新启动功能应用程序时,您的功能应用程序实例将被显式预热,并且能够处理该窗口的消息,但是在空闲时间之后它将再次进入睡眠状态。
可能的解决方案
保持实例预热
始终让您的功能应用程序热身。您可以简单地创建另一个时间触发函数,该函数每隔5分钟左右点击一次服务总线触发函数(正在处理消息的函数),它将使实例始终保持运行状态。
增加重试次数
您需要检查重试次数并增加计数,以便功能应用唤醒时,服务总线仍能够传递消息。
使用应用服务计划
另一种方法是使用应用程序服务计划而不是消费计划。这将使功能应用程序始终保持预热状态以处理消息。考虑到您的工作量(<5),这可能是有点昂贵的选择,因为在消费计划中,您每月可以获得100万要求。