将文件从 SFTP 复制到 Blob 存储时并行执行 Azure 逻辑应用

Posted

技术标签:

【中文标题】将文件从 SFTP 复制到 Blob 存储时并行执行 Azure 逻辑应用【英文标题】:Parallelize Azure Logic App executions when copying a file from SFTP to Blob Storage 【发布时间】:2018-04-06 21:58:56 【问题描述】:

我有一个 Azure 逻辑应用程序,当在 SFTP 服务器中添加或修改新文件时会触发该应用程序。发生这种情况时,该文件将复制到 Azure Blob 存储,然后从 SFTP 服务器中删除。此操作每个文件大约需要 2 秒。

我唯一的问题是这些文件(平均 500kb)是一个一个处理的。鉴于我希望每天传输大约 30,000 个文件,这种方法变得非常慢(大约 18 小时)。

有没有办法扩展/并行化这些执行?

【问题讨论】:

您提到:“我唯一的问题是这些文件(平均 500kb)是一个一个处理的。”默认情况下,在 SFTP 触发器上设置了拆分,因此每个文件(如果检测到多个文件)将触发一次运行,而不是所有文件的一次运行。你没看到这个吗? @Derek 是的,每个文件都会触发单独的执行,但执行是顺序的 听起来不太对劲。拆分触发器应该并行执行 - 您可以检查“诊断”选项卡并查看是否收到任何“运行节流事件”吗?可能是它们并行运行,但由于操作受到限制,看起来它们是按顺序运行的。 @FlorinD.Preda 您的逻辑应用程序能够始终连接到 SFTP 服务器是否存在任何问题,您会在该服务器上获得“跳过”触发器? @aaronR 是的,我有,但我相信是 SFTP 服务器拒绝了我的请求。无论如何,我最终用 C# 编写了传输逻辑 【参考方案1】:

我不确定 Azure Logic App 上是否存在横向扩展/并行执行。但是根据我的经验,如果对时效性的要求不是很高,我们可以使用Foreach来做到这一点,ForEach并行度限制为50,默认为20。

在您的情况下,我的建议是我们可以在 SFTP 中添加或修改新文件时触发循环,然后我们可以将包含文件路径的队列消息作为内容插入到 azure 存储队列中,然后根据时间或结束循环的队列长度。我们可以获得队列消息集合。最后,获取队列消息并从 SFTP 获取文件以在 foreach 操作中创建 blob。

【讨论】:

我喜欢排队“上传到 blob 文件夹”命令的想法。之后,您可以尝试在批处理中使用构建,并在并行 foreach 循环中分批处理多个文件的上传【参考方案2】:

如果您是 C#,请像 Tom Sun 所说的那样使用 Parallel.ForEach。如果你使用这个,我还建议使用async/await 模式进行 IO 操作(保存到 blob)。当文件被保存以服务其他请求时,它将释放执行线程。

【讨论】:

以上是关于将文件从 SFTP 复制到 Blob 存储时并行执行 Azure 逻辑应用的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 Azure Blob 存储复制到 Azure SQLDB 时,Azure 数据工厂错误地复制单元格值

如何在 adf 中按顺序进行复制活动?

使用 Nodejs 将文件从 Azure 存储 blob(容器)复制到 Azure 文件共享

如何从 Blob 存储中复制文件夹?

将文件从AWS S3复制到Azure存储存档层

将文件从远程桌面(RDP)复制到Azure blob存储中