将文件从 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 数据工厂错误地复制单元格值