如何在Azure Functions中追加ZipArchive

4
我正在使用Azure函数(v2)和Blob存储。
我想从多个Blob文件生成一个zip文件。
由于Blob文件非常大,以至于超过了Functions的阈值内存。
我使用System.IO.Compression.ZipArchive,并参考了 如何使用流在Blob中压缩大文件
以下是代码:
using (var blobStream = await archiveBlob.OpenWriteAsync()) using (var resultArchive = new ZipArchive(blobStream, ZipArchiveMode.Create, true)) ....
但接下来,我在5分钟内到达了阈值。
所以我尝试将函数分割并逐步将文件添加到Zip,但在ZipArchive中发生异常。
以下是代码:
using (var resultArchive = new ZipArchive(blobStream, ZipArchiveMode.Update, true)) --> Microsoft.Azure.WebJobs.FunctionFailedException "Update mode requires a stream with read, write, and seek capabilities."
  • BlockBlob是否可以具有读写功能?
  • 还是有其他想法?
谢谢。

1
为什么不将文件作为单个 blob 上传,并将对它们的引用存储为某个表中的集合。如果有人需要该归档,您仍然可以给他们所有的文件。请向我们展示您的错误。在编写 blob 时,每兆字节有10分钟的超时时间。 - Marco
原始文件已经在Blob中。这些文件超过10000个,因此我们被要求下载一个归档文件。第一个错误是由于函数的阈值(5分钟)而引起的异常。以下错误是ZipArchive构造函数的异常。 - PUNIO
@PUNIO,看起来你的应用程序是在消耗计划上运行的,因此默认情况下有5分钟的限制。尝试通过在host.json中添加["functionTimeout": "00:10:00"]来延长函数超时阈值。(https://learn.microsoft.com/en-us/azure/azure-functions/functions-host-json#functiontimeout) - Jerry Liu
@JerryLiu 我也考虑过这个问题。然而,当达到5分钟阈值时,它只能处理大约2000个文件。这甚至不足以满足最大10分钟的要求。使用“应用服务计划”是很昂贵的,所以我希望尽可能避免使用它。 - PUNIO
你可能需要查看Durable函数。https://learn.microsoft.com/zh-cn/azure/azure-functions/durable-functions-overview - Adithya
@AdithyaMorampudi 我正在使用持久化函数。但是从编排器调用的函数也有阈值。 - PUNIO
1个回答

0

我也遇到了同样的问题。由于没有人回答任何能让你更接近解决方案的内容,我将告诉您我在缓解问题方面的经验。

您有两个可能的解决方案:

  1. 将文件拆分为多个压缩存档(最后可以选择将这些已压缩的存档再次压缩成一个)。您可以使用 Azure Durable Functions 实现并发。

  2. 将压缩过程移动到 Azure WebJob。与 Azure Functions 不同,Azure WebJobs 没有像 Azure Functions 那样严格的时间限制,并且它们专门用于此类长时间运行的任务。您可以从 Azure Function 或您的 Web API 触发 WebJob。


最好在WebJob中运行它是个好主意。遗憾的是它没有与Functions一起完成。 - PUNIO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接