gpt4 book ai didi

azure - 多个 Azure 函数应用程序指向一个 Blob 容器(触发器)

转载 作者:行者123 更新时间:2023-12-03 00:08:05 25 4
gpt4 key购买 nike

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

我注意到,当插入 blob 时,多个环境中的 blob 触发器能够立即获取相同的 blob。我确信从那时起这将是一个明显的问题。

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

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

最佳答案

运行 Azure Functions 的函数运行时/主机(在每个本地环境中)彼此隔离,因此它们都会扫描传入的 blob 并单独存储收据。

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

  1. 使用代码插入 blob 时将消息(blob 名称)发送到队列。如果我们使用门户或存储资源管理器手动上传 Blob,我建议创建一个带有队列输出绑定(bind)的 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 输入绑定(bind)获取 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”

关于azure - 多个 Azure 函数应用程序指向一个 Blob 容器(触发器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53823460/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com