将多个 Blob 输入传递给 QueueTrigger Azure 函数的最佳方式

Posted

技术标签:

【中文标题】将多个 Blob 输入传递给 QueueTrigger Azure 函数的最佳方式【英文标题】:Best Way to Pass Multiple Blob Inputs to a QueueTrigger Azure Function 【发布时间】:2017-08-16 21:57:04 【问题描述】:

问题

触发后,生成 3 个 XML 文件,完成后,将它们 ftp 到一个站点。

目前的方法

我有一个 HTTP 触发器 Azure 函数,它在运行时会构建 3 个 XML 文件并将这些文件保存到 Azure 存储 Blob 容器。由于有多个输出,并且需要控制输出路径/文件名,我使用 imperative binding approach 并在我的函数中使用 IBinder outputBinder。这一切都很好。 Blob 存储中的输出路径示例为export/2017-03-22/file-2017-03-22T12.03.02.54.xml。文件在一个有日期的文件夹里,每个文件名都有时间戳,保证唯一性。

当所有 3 个文件都生成后,我想触发另一个函数,将这些文件通过 sFTP 发送到站点。现在我最初认为我应该使用 blob 触发器,但我不知道如何触发文件名和路径是动态的输入。我在blob trigger documentation 中找不到这样的例子。

然后我想我可以将我的 HTTP 触发器输出到声明性绑定,并将 XML 文件输出到我的 blob 存储中的 outgoing 容器中,我的 blob 触发器可以查看该容器。这也有效,因为我的功能是在消费计划上,最多可以有一个10-minute day in processing new blobs。

因此记录在案的替代方法是使用队列触发器。我可以输出到我的队列并很好地触发队列,但是如何将 3 个 XML 流也传递给我的 QueueTrigger 函数?

我想作为后备,我可以发布一个可以包含构建 XML 的 Azure 存储路径的对象,然后使用存储 SDK 来获取流并使用它来发布到 FTP,但它会更多吗将这些存储 Blob 流作为输入传递给我的 QueueTrigger 是否有效?

【问题讨论】:

【参考方案1】:

我认为您使用 Queue Trigger 的方法是有道理的。我会构建这样的消息

public class QueueItem

    public string FirstBlobPath  get; set; 
    public string SecondBlobPath  get; set; 
    public string ThirdBlobPath  get; set; 

然后在队列处理函数中使用声明式绑定,类似


  "bindings": [
    
      "type": "queueTrigger",
      "name": "item",
      "direction": "in",
      "queueName": "myqueue",
      "connection":"...",    
    ,
    
      "type": "blob",
      "name": "file1",
      "path": "mycontainer/FirstBlobPath",
      "connection": "...",
      "direction": "in"
    ,
    
      "type": "blob",
      "name": "file2",
      "path": "mycontainer/SecondBlobPath",
      "connection": "...",
      "direction": "in"
    ,
    
      "type": "blob",
      "name": "file3",
      "path": "mycontainer/ThirdBlobPath",
      "connection": "...",
      "direction": "in"
    
  ],
  "disabled": false

和功能

public static void Run(QueueItem item, Stream file1, Stream file2, Stream file3)


【讨论】:

当您在 blob 输入中有 FirstBlobPath 时,它是否会自动引用 QueueItem 中包含的路径? 这不起作用。无论我尝试什么,我都无法获得流。启动时错误输出为QueueTrigger: Microsoft.Azure.WebJobs.Host: Error indexing method 'Functions.TransmitQueueTrigger'. Microsoft.Azure.WebJobs.Host: Blob identifiers must be in the format 'container/blob'。如何获得此触发器的命令式输入的流? @flyte 确实,忘记了绑定路径中的容器名称。查看更新版本。是的,它指的是 QueueItem 的属性。 hrm.. 我想我们越来越近了。我的容器有一个当天的子文件夹,这似乎引起了问题? A ScriptHost error has occurred Exception while executing function: Functions.TransmitQueueTrigger. Microsoft.Azure.WebJobs.Host: Exception binding parameter 'file1'. Microsoft.Azure.WebJobs.Host: Invalid container name: export/2017-03-24. 即使有或没有斜杠也会发生..? 关于子文件夹的好问题 - 从未尝试过路径中的动态文件夹。如果您想办法让它与子文件夹一起使用,请告诉我。有关文档,请参阅 docs.microsoft.com/en-us/azure/azure-functions/… 的参数绑定

以上是关于将多个 Blob 输入传递给 QueueTrigger Azure 函数的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

通过 Python 脚本将多个输入传递给 .bat 文件

如何将多个图像作为输入传递给python脚本

将相同输入类型的多个值传递给 BigQuery 表值函数

在从 blob 存储中获取文件并传递给模型进行预测时出现 azure aci webservice 的超时错误

将多个 Blob 上传到 Azure 存储

Python 将多个字符串传递给单个命令行参数