【问题标题】:Upload 1Gb file through Logic app using sftp-ssh to Azure File share使用 sftp-ssh 通过逻辑应用将 1Gb 文件上传到 Azure 文件共享
【发布时间】:2020-04-18 22:20:15
【问题描述】:
我正在使用 Logic App 上传 1 Gb 文件,如下所示 -
触发器 - 添加或修改文件时(仅限属性)
Action1 - 获取文件内容
操作 2-创建文件(Azure 文件共享)
直到 35 MB,所有触发器和操作都可以正常工作。在 SFTP 中上传的文件超过 40 MB 后,SFTP-SSH 触发器和操作都可以正常工作。但是,当工作流移动到第二个操作 - “创建文件”时:它失败并出现以下错误“指定的资源可能正在被 SMB 客户端使用”。当我看到 Azure 文件共享存储帐户时,我看到创建了 filename.partial.lock。我也修改了访问策略,但问题仍然存在。
【问题讨论】:
标签:
azure
azure-logic-apps
azure-files
【解决方案1】:
MSFT 在我们的讨论中确认“创建文件共享”有 100 或 300 MB 的限制。当数据以块的形式到达时,它只能与 SFTP 一起使用。当文件大小超过 100 或 300 MB 时,MSFT 正在进一步给出正确的错误声明。以下引自 MSFT 电子邮件-
“感谢您提供详细信息,实际上产品团队向我确认您的流程是幸运的,它不应该适用于这种大小,他们正在努力正确实施限制以防止文件大于最大大小(可能是 300 或 100) “我还不确定”
这种奇怪的行为只有在我们从 SFTP 中读取内容时才会发生。
"
【解决方案2】:
谢谢大家。错误“指定的资源可能正在被 SMB 客户端使用”的原因是由于安装了两个 Linux 虚拟机的文件共享。我们卸载了 Linux 虚拟机并进行了新的单一安装。错误由此得到修复。
【解决方案3】:
我认为解决问题的另一种方法是重新设计,这可能是更具可扩展性的解决方案:
- 如果在 SFTP/FTP 位置添加或修改文件,请使用逻辑应用获取通知。
添加文件后,读取该文件的文件路径。
- 创建服务总线消息并将文件路径到服务总线消息作为消息内容发送。
- 创建服务总线队列消息触发 Azure 函数来监听这些消息(在步骤 2 中创建)
Azure 函数将使用文件路径从 SFTP 读取文件块。
这样您就可以读取或写入超过 30 GB 的文件。
此解决方案将是更可扩展的解决方案,如 azure 功能和按需自动缩放。
【解决方案4】:
要上传大文件,请确保启用Allow chunking。
根据您的描述,假设应该是SharingViolation,您可以查看error codes here。
在官方文档中,有两种情况会导致共享冲突错误:
由于文件访问导致共享冲突
- 客户端 A 使用 FileAccess.Write 和 FileShare.Read 打开文件
(在打开时拒绝后续的写入/删除)。
- 客户端 B 然后使用 FileAccess.Write 打开文件
FileShare.Write(在打开时拒绝后续读取/删除)。
- 结果:客户端 B 遇到共享冲突,因为它指定了
之前指定的共享模式拒绝的文件访问
客户 A。
共享模式导致共享违规
-
客户端 A 使用 FileAccess.Write 和 FileShare.Write 打开文件
(在打开时拒绝后续读取/删除)。
-
客户端 B 然后使用 FileAccess.Write 打开文件
FileShare.Read(在打开时拒绝后续的写入/删除)。
-
结果:客户端 B 遇到共享冲突,因为它指定了
拒绝对仍然打开的文件进行写访问的共享模式
写权限。
这些是您需要考虑的场景,另一种选择是您可以尝试使用 REST API 上传文件并在 HTTP 操作中设置 Allow chunking。