Azure Functions

时间:2016-11-24 22:30:42

标签: azure-functions

我正在评估Azure功能以创建缩略图。较大图像的源URL放置在存储队列中,带有队列触发器的C#函数用于处理URL(从源下载,调整大小并上传到其他位置)。

每个函数调用的处理时间不到500毫秒,这很好。然而,经过一系列测试后,我发现整体并行处理吞吐量并不是那么好。对于队列中1500-2000个项目的工作负载,平台每秒仅执行大约10个函数实例。

有没有办法扩展并使平台同时执行更多的函数实例?

1 个答案:

答案 0 :(得分:8)

消费(动态)计划下运行时,当我们发现您的功能没有跟上时,系统会自动扩展到更多实例。这种向外扩展不是即时的,所以可能是在更多实例被添加之前或之后不久,在可以看到这些新实例的效果之前,您的测试结束。在应用服务(经典)计划中运行时,您可以预先控制实例数量,并可以扩展到您需要的数量。

您可以在host.json文件中设置一些队列配置旋钮,这些旋钮会影响每个功能应用实例的并行度。在queues配置部分下,您可以设置batchSizenewBatchThreshold,例如:

{
   "queues": {
      "batchSize": 32,
      "newBatchThreshold": 50
    }
}

batchSize是每次获取时从队列中提取的消息数。然后批量处理批处理中的所有消息。 newBatchThreshold控制何时获取下一批消息。当当前正在处理的消息数低于此阈值时,仅从队列中提取新的一批消息。因此,增加newBatchThreshold将允许并行处理更多消息。有关这些设置的详细信息,请参阅wiki here

请注意,在调整这些设置时,您必须考虑工作量。例如,如果您的函数是内存/ CPU密集型的,则无法在单个实例上并行运行太多的函数。所以你可能需要进行一些实验。

除了上述所有内容之外,您还应该确保您的函数是一个正确的async函数,以确保不会在IO上不必要地阻塞线程,并且不存在其他潜在的瓶颈。你的功能代码本身。