我正在评估Azure功能以创建缩略图.较大图像的源URL放置在存储队列中,带有队列触发器的C#函数用于处理URL(从源下载,调整大小并上载到另一个位置).
每个函数调用需要500毫秒进行处理,这很好.然而,经过一系列测试后,我发现整体并行处理吞吐量并不是那么好.对于队列中1500-2000个项目的工作负载,平台每秒仅执行大约10个函数实例.
有没有办法扩展并使平台同时执行更多的函数实例?
在消耗(动态)计划下运行时,当我们发现您的功能没有跟上时,系统会自动扩展到更多实例.这种向外扩展不是即时的,所以可能是在更多实例被添加之前或之后不久,在可以看到这些新实例的效果之前,您的测试结束.在App Service(经典)计划中运行时,您可以预先控制实例数,并可以扩展到所需的数量.
您可以在host.json文件中设置一些队列配置旋钮,这些旋钮会影响每个Function App实例的并行度.在queues配置部分下,您可以设置batchSize和newBatchThreshold,例如:
{
"queues": {
"batchSize": 32,
"newBatchThreshold": 50
}
}
Run Code Online (Sandbox Code Playgroud)
batchSize是每次获取时从队列中提取的消息数.然后批量处理批处理中的所有消息.newBatchThreshold管理何时将获取下一批消息.当当前正在处理的消息数低于此阈值时,仅从队列中提取新的一批消息.因此,增加newBatchThreshold将允许并行处理更多消息.有关这些设置的详细信息,请参阅此处的Wiki .
请注意,在调整这些设置时,您必须考虑工作量.例如,如果您的函数是内存/ CPU密集型的,则无法在单个实例上并行运行太多的函数.所以你可能需要进行一些实验.
除了上述所有内容之外,您还应确保您的功能是正确的async功能,以确保不会在IO上不必要地阻塞线程,并且您的功能代码本身不存在其他潜在的瓶颈.
| 归档时间: |
|
| 查看次数: |
1150 次 |
| 最近记录: |