【问题标题】:How to optimize performance of Time-Trigger Azure Function in C#?如何在 C# 中优化 Time-Trigger Azure Function 的性能?
【发布时间】:2021-01-12 09:09:38
【问题描述】:

我有一个时间触发的 Azure 函数,每秒钟运行一次。该函数从 API 服务器读取数据并将其存储到 ADLS。如何优化函数的性能,使其可以进行超过 500 次 API 调用,并在 SECOND 内为每个调用存储每秒数据。

        public static void Run([TimerTrigger("*/1 * * * * *")] TimerInfo myTimer, ILogger log)
        {
            log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");


            log.LogInformation($"Execution starts at: {DateTime.Now.ToString("hh.mm.ss.ffffff")}");

            try
            {
                var IDs = GetIDs(); //makes 1 API call to fetch list of IDs
                
                foreach(var i in IDs){
                   ReadAndWriteData(i); //reads data for each ID from API server and stores in ADLS
                }
            }
            catch (Exception e)
            {
                log.LogError($"An exception has been raised : {e}");
            }

            log.LogInformation($"C# Timer trigger function execution ended at: {DateTime.Now}");
        }
       
        public static async Task<List<string>> GetIDs(){
          //List<string> idList = await Task.Run(()=> ReadIDs()); //makes 1 API call to fetch list of IDs
          //return idList;
        }
       public static async Task ReadAndWriteData(String id){
           //var result = await Task.Run(()=> ReadData()); //reads data for each ID from API server
           ...
           // uploads data to ADLS 
       }

每秒准确获取所有 ID 数据的最佳方法是什么?我尝试了一些并行编程/ TPL 方法,但如果我只使用一个 ID,它仍然可以提供预期的准确性,而不是全部。

【问题讨论】:

  • 我不确定您的问题是什么。 ID和时间有什么关系?
  • 虽然我也不明白您的实际问题是什么,但您的代码看起来是错误的。例如。 var IDs = GetIDs(); 您正在对异步方法进行非等待调用 - 然后尝试在 foreach 循环中使用结果。那是行不通的。
  • 嗨@Magnus,我需要每秒获取所有ID 的数据。让我试着说得更清楚。让我们忘记 ID 并考虑我们必须调用 ** ReadAndWriteData(i)**,其中 i 只是一个字符串列表,如 {"1","2",..."500"}。如果此列表有 2,3 个值,我将每秒获取数据并将其上传到 ADLS 中的以下存储层次结构 yyyy/mm/dd/H/M/S/file.json 中。但是对于 500 个值,我可以看到在每一分钟的文件夹中只有 1 个文件夹被创建一秒钟,而不是全部 60 秒。希望这有助于理解问题。

标签: c# asynchronous azure-functions task-parallel-library azure-function-async


【解决方案1】:

首先,可能有许多问题会给您带来性能问题。您必须使用Azure Service Profiler 或任何其他工具进行调试,并检查哪一行代码花费了多少时间。

一些原因可能是:

  1. 为获取 ID/ADLS 操作编写了低效算法。
  2. 您还没有添加.ConfigureAwait(false)await
  3. Automatic scaling 未为 Azure Functions 启用,并且由于 manual scaling 不足而妨碍缩放。
  4. 您正在使用繁重的 Nuget 包,这需要花费大量时间来创建 Azure Functions 的实例。
  5. 您还没有将ReadIDsReadData 用作asynchronous

【讨论】:

  • 嘿,@singhh-msft。感谢您的建议。 1.虽然功能没有太大的优化空间。我还是会看看的。 2. 添加ConfigureAwait(false)和await,但没有太大区别。 3. 如何启用 Azure Function 的自动缩放? 4. Energistics 是我使用的唯一 Nuget 包,除了 NewtonSoft.Json 等常见包之外,因为我正在处理 WITSML 数据。 5.所有函数都是异步的。
  • 3.缩放:docs.microsoft.com/en-us/azure/azure-functions/…; 5.函数定义应该有Task的返回类型和async关键字。请确保它在那里。休息点:好的
  • 在我的场景中,对功能应用使用消费计划应该可以提高性能吧?因为它最多有 200 个实例。我需要配置什么来确保使用最大实例吗?
  • 这取决于你给的负载。
猜你喜欢
  • 2022-06-16
  • 2019-11-06
  • 1970-01-01
  • 2020-11-07
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多