簡體   English   中英

如何確定為什么並行運行的持久函數仍然很慢

[英]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"

這樣做時我是否遺漏了任何注意事項?

干杯

保羅

maxConcurrentActivityFunctionsmaxConcurrentOrchestratorFunctions應該在durableTask部分內。

"extensions": {
  "durableTask": {
    "hubName": "%HubName%",
    "maxConcurrentActivityFunctions": 5,
    "maxConcurrentOrchestratorFunctions": 5
  },
},
"functionTimeout": "-1"

我遇到過類似的問題,最后我使用了具有一組固定的 VM 實例和自動縮放規則的 App Service Plan。

不是很無服務器,但可以更好地控制應用程序使用的資源。

托管計划

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM