Service Bus队列触发的Azure功能的“唤醒”时间

时间:2019-07-16 15:44:59

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

我有一个由Azure Service Bus队列触发的Azure功能-Azure Function应用托管在使用计划中。

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

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

  

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

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

是否将计时器触发的Azure Function添加到同一Function App(以及触发的Service Bus)有助于保持Azure Function实例正常运行?

3 个答案:

答案 0 :(得分:1)

首先,当使用消耗计划并空闲约20分钟时,功能应用程序将进入空闲状态。然后,如果您使用该功能,您将体验cold start,需要花一些时间才能唤醒。

您的问题:

  

这是否意味着我将无法处理邮件中的第一条消息   排队比30秒之内更快?

这取决于以下内容(链接为here):

1 。您正在使用哪种语言(例如,使用c#的功能比Java更快),请从上面的链接中选择以下语言:

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

2。函数中依赖项的数量:

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

  

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

是的,向同一功能应用程序添加“计时器触发的天蓝色”功能将使其他应用程序保持预热(启动并运行)。

答案 1 :(得分:1)

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

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

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

使用REST API从服务总线实体(队列)中删除/接收消息,订户可以非常容易和直接地获得消息。

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

请注意,只有Azure Service Bus高级层已集成到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;
}

答案 2 :(得分:0)

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

有关更多信息,请参见Azure Functions文档中的Always On。

功能应用程序的超时时间由host.json项目文件中的functionTimeout属性定义。下表以分钟为单位显示了两种计划和两种运行时版本的默认值和最大值:

enter image description here

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

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

HTTP触发器将在您的情况下为您提供帮助,从而确保实例热身,但对于24/7类型的需求,理想的方法是使用专用的App Serice计划。希望对您有所帮助。