多个Azure功能应用程序指向一个Blob容器(触发)

时间:2018-12-17 21:49:18

标签: azure azure-storage azure-functions azure-storage-blobs

在我们的开发环境中,我们有多个环境在运行同一个功能应用程序,但是这些环境都指向相同的存储帐户/ blob容器。

我已经注意到,当插入一个Blob时,该Blob触发器在多个环境中能够一次拾取同一Blob。从那以后,我确信这将是一个问题,这是显而易见的。

有什么办法可以防止这种情况?建议使用更好的触发器来处理这种情况?

我希望收据对Blob是全局的,而不是特定于环境的。

1 个答案:

答案 0 :(得分:0)

运行Azure Functions的Function运行时/主机(在每个本地环境中)彼此隔离,因此它们既扫描传入的Blob,又分别存储收据。

内部,每个主机都会创建自己的队列消息(传入的Blob信息)供Blob触发器使用。我的建议是使用集中式队列。

  1. 使用代码插入Blob时,将消息(blob名称)发送到队列。如果我们使用门户网站或存储资源管理器手动上传Blob,我建议创建一个具有Queue输出绑定的Blob触发器以发送消息,请注意,此触发器应仅在一个主机上运行。在这里使用blob触发器是一个不好的解决方案,因为我们实际上要两次检索blob,但这是我提供手动上传的唯一方法。

    // v2 C# Blob Trigger sample for manual upload
    public static void Run([BlobTrigger("mycontainer/{name}")]Stream myBlob, 
        [Queue("myqueue")]out string message,
        string name, ILogger log)
    {
        log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name}");
        message = name;
    }
    
  2. 使用队列触发器消耗该队列中的消息,然后使用Blob输入绑定获取blob。这样,我们可以确保在所有主机中一次检索到blob。

    // v2 C# sample
    public static void Run([QueueTrigger("myqueue")]string blobName, ILogger log,
        [Blob("mycontainer/{queuetrigger}",FileAccess.Read)]Stream myBlob)
    {
        log.LogInformation($"C# Queue trigger function processed: {blobName}");
        log.LogInformation($"\n Size: {myBlob.Length} Bytes");
    }
    

如果使用v1函数,则本地开发人员还有另一种简单的解决方案。使用这些设置,所有主机中的Blob触发器共享相同的内部队列和Blob收据。

  1. local.settings.json中,确保每个Function项目的AzureWebJobsStorage都具有相同的值(在其中放置blob收据,内部队列等)。
  2. host.json中,为每个主机添加相同的id(用于构造Blob收据和内部队列的名称),例如"id":"localhost-1300897049"