[英]How to identify why durable functions running in parallel are still slow
我們有以下 function 將任務拆分為單獨的函數(扇出)
[FunctionName("process-orchestration")]
public async Task ProcessOrchestrationAsync(
[OrchestrationTrigger] IDurableOrchestrationContext context)
{
var runProcessEvent = context.GetInput<RunProcessDto>();
var processStartedAt = context.CurrentUtcDateTime;
// 1. Initialise process
var initialiseProcessResponseDto = await context.CallActivityAsync<InitialiseProcessResponseDto>
("initialise-process-activity", );
// 2. Run process segment tasks in parallel
var tasks = new List<Task<RunProcessSegmentResponseDto>>();
foreach (var runProcessRequestDto in initialiseProcessResponseDto.RunProcessRequestDtos)
{
var subTask = context.CallActivityAsync<RunProcessSegmentResponseDto>("run-process-segment-activity", runProcessRequestDto);
tasks.Add(subTask);
}
await Task.WhenAll(tasks);
// 3. Aggregate results
var runProcessSegmentResponseDtos = new List<RunProcessSegmentResponseDto>();
foreach (var eachTask in tasks)
{
var taskResult = eachTask.Result;
runProcessSegmentResponseDtos.Add(taskResult);
}
var aggregateProcessResultDto = new AggregateProcessResultDto()
{
RunProcessRequestDto = new RunProcessRequestDto()
{
NoOfDays = runProcessEvent.NoOfDays,
},
RunProcessSegmentResponseDtos = runProcessSegmentResponseDtos
};
var runProcessResponseDto = await context.CallActivityAsync<RunProcessResponseDto>("aggregate-process-result-activity", aggregateProcessResultDto);
// 4. Finalise process
runProcessResponseDto.ProcessStartedAt = processStartedAt;
runProcessResponseDto.ProcessFinishedAt = context.CurrentUtcDateTime;
await context.CallActivityAsync<RunProcessResponseDto>("finalise-process-activity", runProcessResponseDto);
}
這需要一個日期范圍並分成幾個部分
然后並行處理每個段
所有segment處理完之后,再合並結果,這個過程就可以了
然而,當我查看分段的細分時,有些分段需要很長時間才能運行,即使它們沒有很多天
Start date: 03/07/2022
End date: 01/10/2022
No of days: 90
Diagnostic started: 01/10/2022 10:02:48 GMT
Diagnostic finished: 01/10/2022 11:41:51 GMT
Segment start date: 03/07/2022
Segment end date: 18/07/2022
Segment started at: 01/10/2022 10:02:48
Segment finished at: 01/10/2022 11:41:36
Segment start date: 19/07/2022
Segment end date: 03/08/2022
Segment started at: 01/10/2022 10:02:48
Segment finished at: 01/10/2022 11:37:26
Segment start date: 04/08/2022
Segment end date: 19/08/2022
Segment started at: 01/10/2022 10:02:48
Segment finished at: 01/10/2022 11:35:59
Segment start date: 20/08/2022
Segment end date: 04/09/2022
Segment started at: 01/10/2022 10:02:48
Segment finished at: 01/10/2022 11:17:13
Segment start date: 05/09/2022
Segment end date: 20/09/2022
Segment started at: 01/10/2022 10:02:48
Segment finished at: 01/10/2022 10:19:05
Segment start date: 21/09/2022
Segment end date: 01/10/2022
Segment started at: 01/10/2022 10:02:48
Segment finished at: 01/10/2022 10:14:03
我試圖將 function 擴展為最大功率溢價 function 並且時間沒有什么不同(這適用於上面的時間)
我還將此添加到我的 host.json 以防並行運行的段太多
"extensions": {
"durableTask": {
"hubName": "%HubName%"
},
"maxConcurrentActivityFunctions": 5,
"maxConcurrentOrchestratorFunctions": 5
},
"functionTimeout": "-1"
這樣做時我是否遺漏了任何注意事項?
干杯
保羅
maxConcurrentActivityFunctions
和maxConcurrentOrchestratorFunctions
應該在durableTask
部分內。
"extensions": {
"durableTask": {
"hubName": "%HubName%",
"maxConcurrentActivityFunctions": 5,
"maxConcurrentOrchestratorFunctions": 5
},
},
"functionTimeout": "-1"
我遇到過類似的問題,最后我使用了具有一組固定的 VM 實例和自動縮放規則的 App Service Plan。
不是很無服務器,但可以更好地控制應用程序使用的資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.