处理 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;
}