将多个 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 函数的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章