Azure Functions - 从队列触发器绑定 blob 列表

Azure Functions - bind a list of blobs from a queue trigger

我正在编写一个函数,将大量输入图像拼接成一个高图像,并将其保存到输出 blob。有没有办法绑定到来自队列触发器的可变数量的输入?

这是一个示例队列项目:

{
  "inputIds": [1001, 1002, 1003, 1004], // Input blobs "inputs/1001.jpg", etc.
  "outputId": 15                        // Output blob "output/15.jpg"
}

我查看了选项 in the docs,我目前的想法是在 CloudBlobContainer 上使用 [Blob] 属性,我认为这是允许的:

[FunctionName("stitch")]
public static async Task Run(
  [QueueTrigger("stitch")]QueueItem queueItem, 
  [Blob("inputs")]CloudBlobContainer inputContainer, 
  [Blob("results/{outputId}.jpg")]CloudBlockBlob output)
{
  IList<CloudBlockBlob> inputs = await GetBlobsAsync(inputContainer, queueItem.InputIds);
  Stream result = ConcatImages(inputs);
  await output.UploadFromStreamAsync(result);
}

在这种情况下,QueueItem 是自定义的 class,GetBlobsAsync()ConcatImages() 是我可以实现的功能。

但是我可以直接绑定到一个IEnumerable<CloudBlockBlob>(或IEnumerable<Stream>)吗?如果可以,我将如何编写[Blob]输入属性?

编辑:我可以在不将所有输入 blob 内容同时加载到内存的情况下这样做吗?我需要一次播放一个。

我建议你的架构是错误的。

您似乎正确地使用了队列触发器和定义成像拼接任务范围的负载 QueueItem,但为什么要绑定到输入 blob 存储?当您循环遍历 inputId 时,需要在您的代码中动态获取输入 blob。这样做还可以解决您对同时将所有输入 blob 存储在内存中的其他担忧。