【发布时间】: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