【问题标题】:Azure function not running parallelAzure 函数未并行运行
【发布时间】:2021-11-26 21:32:16
【问题描述】:

我在 python 中创建了一个 azure 函数。 我通过 C# 调用它,预计我会同时发送大约 1000 个请求。对于这个功能,我需要它是并行处理这些请求,而不是一个接一个地处理,但我无法实现。

这是我并行发送 10 个请求的测试代码。

static void Main(string[] args)
    {
        List<string> symbols = new List<string> { "MSFT", "AAPL", "NFLX", "JNJ", "INTC", "GOOG", "AMZN", "FB", "TSLA", "TSM" };           
        List<string> results = new List<string>();
        List<string> urls = new List<string>();
        Parallel.ForEach(symbols, (symbol) =>
        {
            Trace.WriteLine("Getting - " + symbol);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create("MY FUNCTION URL");
            request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            using (Stream stream = response.GetResponseStream())
            using (StreamReader reader = new StreamReader(stream))
            {
                Trace.WriteLine(reader.ReadToEnd());
            }
            Trace.WriteLine("Finished - " + symbol);
        });
        Console.ReadKey();

    }

我可以看到请求是一起发送的。但处理是一个接一个。 这是我的 host.json 文件:

{
  "version": "2.0",
  "logging": {
    "applicationInsights": {
      "samplingSettings": {
        "isEnabled": true,
        "excludedTypes": "Request"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[2.*, 3.0.0)"
  },
  "extensions": {
    "queues": {
      "batchSize": 1
    },
    "http": {
    "routePrefix": "api",
    "maxOutstandingRequests": 200,
    "maxConcurrentRequests": 1
    }
 

} }

据我了解,将“maxConcurrentRequests”设置为 1 会强制函数应用向外扩展并创建多个实例。我尝试将此值设置为 10 和 100,但它什么也没做。

我还尝试将以下配置值添加到函数应用:

FUNCTIONS_WORKER_PROCESS_COUNT = 10。

PYTHON_THREADPOOL_THREAD_COUNT = 32。

这也没有任何区别。

我可以在 azure 分析中看到,函数是根据它们的时间戳一个接一个地处理的。并且累计时间为~ 10 * 单次运行。

我很确定这是一个配置问题,我错过了什么?

谢谢

阿米特

【问题讨论】:

  • 大胆猜测,但尝试将extensions.queues.batchSize 设置为 10?
  • @ErmiyaEskandary extensions.queues.batchSize 用于存储队列设置,并告诉函数一次从队列中检索那么多消息。它对http请求处理没有影响。请参阅文档。 docs.microsoft.com/en-us/azure/azure-functions/…

标签: .net azure parallel-processing azure-functions


【解决方案1】:

看看这个documentation,上面写着

并行执行的 HTTP 函数的最大数量。 该值允许您控制并发,这可以帮助管理 资源利用率。例如,您可能有一个 HTTP 函数 使用大量系统资源(内存/cpu/sockets),例如 当并发性太高时会导致问题。或者你可能有 向第三方服务发出出站请求的函数,以及 这些呼叫需要限制速率。在这些情况下,应用 油门在这里可以提供帮助。 *Consumption 计划的默认值为 100。Dedicated 计划的默认值为无限制 (-1)。

将其设置为 1,基本上是告诉它不要并行处理请求。如果将其设置为 100,它将尝试一次处理 100 个。如果所需的内存或 CPU 更多并且队列中还有更多请求,则函数将开始自动扩展(假设您处于消耗计划中)。

【讨论】:

  • 我把它改成了 10 和 100 并没有任何区别
  • 你的函数使用什么代码?如果是python,那么您可以尝试将工作进程计数更改为10 docs.microsoft.com/en-us/azure/azure-functions/…,将线程池计数更改为32 docs.microsoft.com/en-us/azure/azure-functions/…。如果它仍然不起作用,您应该使用您的函数代码编辑问题。
  • 我已经尝试了这两个设置,它们没有改变任何东西。我不能将我的功能代码作为其敏感 IP 共享。它基本上使用熊猫进行许多计算。大约需要 4-8 秒。
  • 正在处理的数据的大小是多少?您仅限于函数实例的 RAM。如果您使用的是未设置扩展规则的应用服务,并且您达到了 RAM 限制,那么您的函数将一次处理 1 个请求。如果您使用的是消费计划,则限制为 1.5GB,并且仅通过 10 个请求可能没有足够的时间进行扩展。您能否检查您的实时应用程序洞察,了解收到 10 个请求时的 CPU 和内存消耗情况,并告诉我们您使用的是什么服务计划?
  • 我正在使用消费计划。在实时指标上,它显示提交的大小约为 800MB,CPU 为 2%,即使没有运行,一旦我发送 10 个请求,这两个指标都没有真正变化。
猜你喜欢
  • 2022-06-23
  • 2022-09-30
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-29
  • 2021-07-31
  • 2021-10-31
  • 1970-01-01
相关资源
最近更新 更多