【问题标题】:"Wake up" time of Azure Function triggered by Service Bus QueueService Bus Queue 触发 Azure Function 的“唤醒”时间
【发布时间】:2019-07-17 20:55:26
【问题描述】:

我有一个由 Azure 服务总线队列触发的 Azure Function - Azure Function App 托管在消费计划中。

队列中出现新消息时,最多需要多长时间才能唤醒 Azure Function? (假设过去 20 分钟内没有消息)。

它是否在任何地方指定?我在Documentation 中发现:

对于非 HTTP 触发器,新实例最多每 30 秒分配一次。

这是否意味着我无法在 30 秒内更快地处理队列中的第一条消息?

将计时器触发的 Azure 函数添加到同一个函数应用程序(连同触发的服务总线)是否有助于保持 Azure 函数实例正常运行?

【问题讨论】:

标签: c# .net azure azure-functions azureservicebus


【解决方案1】:

处理 ServiceBusTrigger 函数的“冷启动”的另一个选项是使用 Azure 事件网格 的事件功能,如果有服务总线实体中没有消息,并且有新消息到达。查看更多详情here

请注意,当第一条消息到达服务总线实体时,会立即发出该事件。在这种情况下,当消息存在时,根据侦听器/接收器的空闲时间发出下一个事件。这个空闲(看门狗)时间是从最后一次使用服务总线实体上的侦听器/接收器开始的 120 秒。

这是一个推送模型,服务总线实体上没有侦听器,因此 AEG 订阅者(EventGridTrigger 函数)将“平衡”接收与 ServiceBusTrigger 函数(其侦听器/接收器)的消息。

使用REST API 删除/接收来自服务总线实体(队列)的消息,订阅者可以非常简单直接地获得它。

因此,使用主题 providers/Microsoft.ServiceBus/namespaces/myNamespace 上的 AEG 事件并过滤 eventType = "Microsoft.ServiceBus.ActiveMessagesAvailableWithNoListeners",可以通过 ServiceBudTrigger 函数并排接收消息,解决“冷启动”时的 AF 问题。

请注意,只有 Azure 服务总线高级层集成到 AEG。

以下代码 sn-p 显示了使用 EventGridTrigger 函数的服务总线的 AEG 订阅者示例:

#r "Newtonsoft.Json"

using System;
using System.Threading.Tasks;
using System.Text;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

public static async Task Run(JObject eventGridEvent, ILogger log)
{
    log.LogInformation(eventGridEvent.ToString());

    string requestUri = $"{eventGridEvent["data"]?["requestUri"]?.Value<string>()}";
    if(!string.IsNullOrEmpty(requestUri))
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("Authorization", Environment.GetEnvironmentVariable("AzureServiceBus_token"));
            var response = await client.DeleteAsync(requestUri);

            // status & headers
            log.LogInformation(response.ToString());

            // message body
            log.LogInformation(await response.Content.ReadAsStringAsync());
        }
    }

    await Task.CompletedTask;
}

【讨论】:

    【解决方案2】:

    首先,当使用消费计划并闲置约 20 分钟时,函数应用进入闲置状态。然后如果你使用该功能,你会遇到cold start,需要一些时间才能唤醒。

    对于您的问题:

    这是否意味着我将无法处理 排队速度超过 30 秒?

    这取决于以下(链接是here):

    1.你正在使用哪种语言(例如,使用c#的函数比java更快),以下是从上面的链接中提取的:

    典型的冷启动延迟时间为 2 到 15 秒。 C# 函数通常在 3 秒内完成启动,而 JavaScript 和 Java 的尾巴更长。

    2.你的函数中依赖的数量:

    添加依赖项从而增加部署的包大小将进一步增加冷启动持续时间。

    会将计时器触发的 Azure 函数添加到同一个函数应用程序 (连同触发的服务总线)有助于保持 Azure 功能 实例启动并运行?

    是的,将 Timer Triggered azure 函数添加到同一个函数应用程序将使其他函数应用程序保持预热(启动并运行)。

    【讨论】:

      【解决方案3】:

      Azure Functions 可以在消费计划或专用应用服务计划上运行。 如果你在专用模式下运行,你需要开启Always On设置,你的Function App才能正常运行。 Function 运行时将在几分钟不活动后空闲,因此只有 HTTP 触发器实际上会“wake up”您的函数。这类似于 WebJobs 必须启用 Always On。

      有关详细信息,请参阅 Azure Functions 文档中的 Always On。

      函数应用的超时持续时间由 host.json 项目文件中的 functionTimeout 属性定义。下表显示了两个计划和两个运行时版本的默认值和最大值(以分钟为单位):

      您可以在此处阅读有关冷启动的更多信息。

      https://azure.microsoft.com/en-in/blog/understanding-serverless-cold-start/

      HTTP 触发器在您的情况下肯定会帮助您预热您的实例,但满足 24/7 类型要求的理想方法是使用专用的 App Serice 计划。希望对您有所帮助。

      【讨论】:

      • 超时时长不是指冷启动,而是指处理消息的最长时间。
      猜你喜欢
      • 2020-02-27
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      • 2022-12-27
      • 1970-01-01
      • 2019-01-26
      • 2022-08-17
      相关资源
      最近更新 更多