【问题标题】:Azure Service Bus trigger not firing sometimesAzure 服务总线触发器有时不会触发
【发布时间】:2019-03-18 06:02:21
【问题描述】:

我创建了一个函数应用程序 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);
  • 我在本地运行函数时没有看到这个问题。
  • 新消息 (
  • 我正在使用消费计划
  • host.json 为空

请帮忙。

【问题讨论】:

    标签: azure azureservicebus azure-servicebus-queues


    【解决方案1】:

    冷启动

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

    我认为的问题

    查看您在我看来共享的统计信息,当您的服务总线尝试传递消息时,函数应用正在休眠并且由于消息未能传递而无法传递。当您重新启动函数应用时,您的函数应用实例会显式预热,并且能够处理该窗口的消息,但它会在空闲期后再次进入睡眠状态。

    可能的解决方案

    保持实例温暖

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

    增加重试次数

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

    使用应用服务计划

    另一种方法是使用应用服务计划而不是消费计划。这将使函数应用程序始终处于预热状态以处理消息。考虑到您的工作量(

    【讨论】:

    • 完全有道理。增加重试次数有帮助。但我可能应该致力于减少功能开始时间:) 谢谢!
    • 很高兴它有帮助。您能否提及您之前和现在的重试次数?
    • 当然。原来是10个,我增加到30个。
    猜你喜欢
    • 2021-08-14
    • 2022-06-10
    • 1970-01-01
    • 2021-09-28
    • 2018-08-10
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多