我正在考虑将一些代码放入 Azure 函数中,并且我对内存限制以及函数如何扩展有疑问/担忧。
在高端,应用程序一次执行可以使用大约 800 MB 的内存,因此如果我可以使用的最大内存是 1536MB,我只能有 1 个并发执行而不会耗尽内存。
我的理解是最多可以有 10 个实例,有 x 个并发执行,但是如果最大容量只允许我运行 1 个而不会超时,这是否意味着我需要手动设置最大容量并发执行数为 1,并且它会自动扩展到最多 10 个实例,这意味着我一次只能执行 10 个整体?
如果是这样,那就太糟糕了,因为我预计大多数执行所需的内存都比这少得多。
这是一个文件操作函数,因此我可以根据输入文件大小对将使用多少内存有一个相当准确的猜测,因此如果我重构后端以根据输入大小填充各种队列,我可以有 1 个用于高端内容的队列(每个实例一次只允许执行 1 次),然后将其划分为其他大小的队列,并手动调整最大并发实例数,并使用针对其关联队列的特定函数。
例如任何小于 1mb 的文件有 1 个队列,尽可能多的执行 = 1 个不受限制的函数。
1 个队列用于 1mb-10mb 输入文件,限制为 20 个并发执行。
等等
感觉工作量比应有的要多,但也不是太痛苦。
这看起来是一个明智的方法,还是有更简单的方法?
到底如何限制并发执行的数量?
最佳答案
一些背景说明:
- Blob 处理由队列在幕后处理。当我们找到新的(或修改的)blob 时,我们将该 blob 信息放入队列消息中并将其排入队列。这意味着 host.json 中适用于队列的设置也适用于 Blob 处理。
- 函数的队列配置位于主机级别并由所有队列使用。为了使您的方案发挥作用,您需要为每批文件大小创建一个函数应用,并在 host.json 中配置
queues
->batchSize
对于该应用程序。因为您可能会遇到内存限制,所以这可能是您最好的选择,因为您不会在同一主机上并行运行多个函数。
我不相信我们会在任何地方发布最大可用实例数,但我可以告诉您,10 不再是限制。这是早期的限制,后来已被取消。最好的选择是尝试一下,看看如何扩展。如果添加 Application Insights support ,您可以很容易地看到实时流中当前运行的实例数量。
关于Azure Functions - 缩放和内存限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44604073/