Azure 存储 Blob 触发器未唤醒睡眠功能

Posted

技术标签:

【中文标题】Azure 存储 Blob 触发器未唤醒睡眠功能【英文标题】:Azure Storage Blob Trigger is not awakening a sleeping function 【发布时间】:2020-08-17 06:46:10 【问题描述】:

这个问题类似于Azure Blob Storage trigger Function not firing

但是,他们的问题是他们的 Azure Function 没有立即唤醒,给人的印象是它没有处理来自 Azure Blob 存储的触发器,而实际上它是在 10 分钟之后,这与 MS 文档声称的完全一样。

https://docs.microsoft.com/en-us/azure/azure-functions/functions-bindings-storage-blob-trigger?tabs=csharp

我的问题不同。我的 blob 现在已经在容器中放置了 9 个小时,但仍未处理。

它所做的只是在 ServiceBus 上发布一条消息。

[FunctionName("IncomingFileDetected")]
[return: ServiceBus("incoming-file-received", EntityType = Microsoft.Azure.WebJobs.ServiceBus.EntityType.Topic)]
public static IncomingFile Run(
    [BlobTrigger("incoming-files/filename", Connection = "ConnectionStrings:MutableStorage")]
    Stream contents,
    string filename,
    ILogger log)

    log.LogInformation($"Detected new blob file: filename");
    return new IncomingFile(filename);

服务总线中没有出现任何消​​息。

现在,9 小时后,我重新启动了函数应用,并且在大约 10 分钟内处理了 blob。

【问题讨论】:

您使用的是哪种 AppService 计划?如果您不使用消费计划,则需要启用“始终开启”。 嗨@AlexAIT,你能告诉我我要去哪里检查吗? 如果您在 Azure 门户中打开函数应用程序,您可以在屏幕中间的状态、subscriptionId 等旁边看到App Service plan / pricing tier。如果它显示“Consumption”以外的任何内容,例如“高级V2”。这是一张图片:docs.microsoft.com/en-us/azure/azure-functions/…always on 设置在“配置-常规设置”下 函数触发后,Blob 不会从 Blob 存储中移除。你可以看看我的代码,它在本地和 azure 上都可以正常工作。 【参考方案1】:

更新:

感谢彼得莫里斯的分享,问题出在服务计划是d1。所以首先要确定你是基于三种计划:消费计划、高级计划和应用服务计划。当我们使用 azure 功能时,即使只是测试,我们也应该使用消费计划。生产中最小的是 S1,通常用于测试。

原答案:

下面的代码在我这边运行良好。连消费计划都没有问题。

using System;
using System.IO;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host;
using Microsoft.Extensions.Logging;

namespace FunctionApp35

    public static class Function1
    
        [FunctionName("Function1")]
        [return: ServiceBus("test", Connection = "ServiceBusConnection")]
        public static string Run([BlobTrigger("samples-workitems/name", Connection = "str")]Stream myBlob, string name, ILogger log)
        
            log.LogInformation($"C# Blob trigger function Processed blob\n Name:name \n Size: myBlob.Length Bytes");
            string a = "111111111111111";
            return a;
        
    

这是我的本地设置:


    "IsEncrypted": false,
  "Values": 
    "AzureWebJobsStorage": "DefaultEndpointsProtocol=https;AccountName=0730bowmanwindow;AccountKey=lti/ThmF+mw9BebOacp9gVazIh76Q39ecikHSCkaTcGK5hmInspX+EkjzpNmvCPWsnvapWziHQHL+kKt2V+lZw==;EndpointSuffix=core.windows.net",
    "FUNCTIONS_WORKER_RUNTIME": "dotnet",
    "str": "DefaultEndpointsProtocol=xxxxxx",
    "ServiceBusConnection": "Endpoint=sb://bowmantestxxxxxx"
  

str 来自这个地方:

ServiceBusConnection 来自这个地方:

请注意,触发 azure 功能后,blob 不会从容器中删除。另外,不要忘记在您的服务总线主题中创建至少一个订阅。

在将功能部署到azure后,以上所有内容也可以正常工作。(与本地的区别是您需要在配置设置中添加设置而不是local.settings.json)

【讨论】:

感谢您付出了这么多努力!将其放置几个小时,然后将某些内容上传到 blob,它不会得到处理。问题是我们处于低于消费的层次(甚至不知道存在)。 @PeterMorris 低于消费?你的是什么? DevOps 人说它在 D1 Shared 上,他把它移到了 S1-Standard。 @PeterMorris 嗨,彼得。谢谢你的分享。我已经在我的回答中更新了。你能把它标记为这个问题的答案吗?这将帮助遇到类似问题的其他人。:)

以上是关于Azure 存储 Blob 触发器未唤醒睡眠功能的主要内容,如果未能解决你的问题,请参考以下文章

用于文件共享的 Azure 触发功能

Blob 存储上的 Azure 触发器,从图像 (Blob) 中提取 EXIF (lat/long/direction...) 数据

“排队”的 Azure 事件网格 Blob 触发器事件消息存储在哪里,如何清除它们?

如何脱机调试 Azure Blob 存储触发器?

将文件上传到 Azure Blob 存储时没有触发事件网格事件——为啥?

Azure - 为存储容器中的每个新 blob 触发 Databricks 笔记本