Azure Functions - 缩放和内存限制
Azure Functions - Scaling And Memory Limitations
我有一些代码正在考虑放入 Azure 函数中,并且我有关于内存限制和函数缩放方式的 question/concern。
在高端,应用程序单次执行可能使用大约 800 MB 的内存,所以如果我可以使用的最大内存是 1536 MB,没有它我只能有 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 函数中,并且我有关于内存限制和函数缩放方式的 question/concern。
在高端,应用程序单次执行可能使用大约 800 MB 的内存,所以如果我可以使用的最大内存是 1536 MB,没有它我只能有 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,您可以很容易地看到当前 运行 在实时流中的实例数。