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

时间:2017-08-15 17:38:47

标签: c# azure azure-functions

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

这是一个示例队列项:

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

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

[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是自定义类,GetBlobsAsync()ConcatImages()是我可以实现的功能。

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

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

1 个答案:

答案 0 :(得分:1)

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

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