如何在C#中优化时间触发Azure函数的性能?
我有一个每秒运行的时间触发Azure函数。该函数从API服务器读取数据并将其存储到ADL中。如何优化函数的性能,使其能够进行500次以上的API调用,并在一秒钟内存储每个调用的每秒数据如何在C#中优化时间触发Azure函数的性能?,c#,asynchronous,azure-functions,task-parallel-library,azure-function-async,C#,Asynchronous,Azure Functions,Task Parallel Library,Azure Function Async,我有一个每秒运行的时间触发Azure函数。该函数从API服务器读取数据并将其存储到ADL中。如何优化函数的性能,使其能够进行500次以上的API调用,并在一秒钟内存储每个调用的每秒数据 public static void Run([TimerTrigger("*/1 * * * * *")] TimerInfo myTimer, ILogger log) { log.LogInformation($"C# T
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
}
publicstaticvoidrun([TimerTrigger(***/1*****)]TimerInfo myTimer,ILogger log)
{
log.LogInformation($“C#计时器触发器函数在:{DateTime.Now}执行”);
log.LogInformation($”执行开始于:{DateTime.Now.ToString(“hh.mm.ss.ffffff”)});
尝试
{
var IDs=GetIDs();//进行1次API调用以获取ID列表
foreach(id中的var i){
ReadAndWriteData(i);//从API服务器读取每个ID的数据并存储在ADL中
}
}
捕获(例外e)
{
LogError($“引发了异常:{e}”);
}
log.LogInformation($“C#计时器触发器函数的执行在:{DateTime.Now}结束);
}
公共静态异步任务GetIDs(){
//List idList=wait Task.Run(()=>ReadIDs());//进行1次API调用以获取ID列表
//返回懒汉;
}
公共静态异步任务读写数据(字符串id){
//var result=wait Task.Run(()=>ReadData());//从API服务器读取每个ID的数据
...
//将数据上载到ADL
}
每秒准确获取所有ID数据的最佳方法是什么?我尝试过一些并行编程/TPL方法,但如果我只使用一个ID,而不是所有ID,它仍能提供预期的准确性。首先,可能有许多问题会给您带来性能问题。您必须使用或任何其他工具进行调试,并检查哪行代码花费了多少时间 其中一些原因可能是:
.ConfigureAwait(false)
与await
一起添加自动缩放
未为Azure功能启用
,并且由于手动缩放不足
而阻碍了缩放readid
和ReadData
功能设置为我不确定你有什么问题。ID和时间之间的关系是什么?虽然我也不明白您的实际问题是什么,但您的代码看起来是错误的。例如,
varids=GetIDs()代码>您正在对异步方法进行未等待的调用,然后尝试在foreach循环中使用结果。这不是那样的。嗨@Magnus,我需要每秒获取所有ID的数据。让我试着说得更清楚些。让我们忘记ID,并考虑我们必须调用**Read and Read DATA(i)**,其中我只是一个字符串列表,如{ 1”、“2”、“500”}。如果此列表有2,3个值,我将每秒获取数据,并将其上传到以下存储层次结构yyyy/mm/dd/H/M/S/file.json中的ADLS中。但对于500个值,我可以看到在每分钟的文件夹中,一秒钟只创建一个文件夹,而不是所有60秒。希望,这有助于理解问题。嘿,@singhh-msft。谢谢你的建议。1.虽然函数没有太多的优化空间。我还是会看一看的。2.添加了ConfigureAwait(false)
和await,但没有太大区别。3.如何为Azure功能启用自动缩放?4.Energistics是我使用的唯一一个Nuget软件包,除了像NewtonSoft.Json这样的普通软件包,因为我使用的是WITSML数据。5.所有函数都是异步的。缩放:;5.函数定义应在返回类型中包含Task
,并包含async
关键字。请确保这个在那里。关于休息点:好的在我的场景中,使用function app的消费计划应该会提高性能,对吗?因为它最多有200个实例。是否需要配置任何东西以确保使用max实例?这取决于您所提供的负载。