繁体   English   中英

服务总线队列触发 Azure Function 的“唤醒”时间

[英]"Wake up" time of Azure Function triggered by Service Bus Queue

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

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

是否在任何地方指定? 我在文档中发现:

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

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

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

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

对于您的问题:

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

这取决于以下内容(链接在这里):

1 .您使用的是哪种语言(例如,使用 c# 的函数比 java 更快),以下内容摘自上面的链接:

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

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

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

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

是的,将计时器触发的 azure 函数添加到同一个函数应用程序将使其他应用程序保持热身(启动和运行)。

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

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

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

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

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

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

以下代码片段显示了使用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;
}

Azure Functions 可以在消耗计划或专用应用服务计划上运行。 如果您在专用模式下运行,您需要为您的功能应用程序打开Always On设置才能正常运行。 函数运行时会在几分钟不活动后进入空闲状态,因此只有 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 类型要求的理想方法是使用专用的应用程序服务计划。 希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM