簡體   English   中英

Azure Durable Functions 的 CallActivityWithRetryAsync 不會在失敗時重試

[英]Azure Durable Functions' CallActivityWithRetryAsync does not retry on failure

在我的編排器 function 中,我將請求文件上傳到外部服務器。 經過一些不確定的時間后,應該已經生成了一個響應文件。 我需要輪詢這個文件並下載它。

我目前的做法是上傳后等待 10 分鍾。 然后使用內置的CallActivityWithRetryAsyncRetryOptions 在第一次輪詢/下載失敗后,等待 5 分鍾再開始總共 10 次重試嘗試。 只有在活動 function 中引發帶有消息RESPONSE_FILE_NOT_YET_AVAILABLE的異常時,才應嘗試重試。

        var nowIn10Minutes = ctx.CurrentUtcDateTime.AddMinutes(10);
        await ctx.CreateTimer(nowIn10Minutes, CancellationToken.None);

        const string RETRY_ERROR_MESSAGE = "RESPONSE_FILE_NOT_YET_AVAILABLE";
        var retryOptions = new RetryOptions(TimeSpan.FromMinutes(5), 10)
        {
            Handle = ex => ex.Message == RETRY_ERROR_MESSAGE
        };
        await ctx.CallActivityWithRetryAsync(nameof(PollForResponseAndDownload), retryOptions, input);

但是,根據日志,這種重試邏輯沒有得到遵守。 見下文。

在計時器中設置的等待 10 分鍾后,編排立即失敗並出現 FunctionFailedException。 盡管日志中顯示了正確的異常消息,但不執行重試。

我從根本上誤解了這個過程嗎? 以下是相關日志:

-> 上傳請求后,等待10分鍾

2022-01-31 00:00:06.740 <GUID>: Function 'MyOrchestrator (Orchestrator)' is waiting for input. Reason: CreateTimer:2022-01-31T00:10:06.5093237Z. IsReplay: False. State: Listening. HubName: <HUB-NAME>. AppName: <APP-NAME>. SlotName: Production. ExtensionVersion: 2.6.0. SequenceNumber: 112.
2022-01-31 00:00:06.741 <GUID>: Function 'MyOrchestrator (Orchestrator)' awaited. IsReplay: False. State: Awaited. HubName: <HUB-NAME>. AppName: <APP-NAME>. SlotName: Production. ExtensionVersion: 2.6.0. SequenceNumber: 113.

-> 10分鍾后恢復,安排活動function執行

2022-01-31 00:10:32.700 <GUID>: Function 'MyOrchestrator (Orchestrator)' was resumed by a timer scheduled for '2022-01-31T00:10:06.5093237Z'. IsReplay: False. State: TimerExpired. HubName: <HUB-NAME>. AppName: <APP-NAME>. SlotName: Production. ExtensionVersion: 2.6.0. SequenceNumber: 114.
2022-01-31 00:10:32.701 <GUID>: Function 'PollForResponseAndDownload (Activity)' scheduled. Reason: MyOrchestrator. IsReplay: False. State: Scheduled. HubName: <HUB-NAME>. AppName: <APP-NAME>. SlotName: Production. ExtensionVersion: 2.6.0. SequenceNumber: 115.
2022-01-31 00:10:32.701 <GUID>: Function 'MyOrchestrator (Orchestrator)' awaited. IsReplay: False. State: Awaited. HubName: <HUB-NAME>. AppName: <APP-NAME>. SlotName: Production. ExtensionVersion: 2.6.0. SequenceNumber: 116.

-> 開始活動 function。 它立即失敗並顯示預期的 ex.Message,但仍然無法運行重試邏輯。

2022-01-31 00:10:32.715 <GUID>: Function 'PollForResponseAndDownload (Activity)' started. IsReplay: False. Input: (368 bytes). State: Started. HubName: <HUB-NAME>. AppName: <APP-NAME>. SlotName: Production. ExtensionVersion: 2.6.0. SequenceNumber: 117. TaskEventId: 5
2022-01-31 00:10:37.078 <GUID>: Function 'PollForResponseAndDownload (Activity)' failed with an error. Reason: System.Exception: RESPONSE_FILE_NOT_YET_AVAILABLE at MyNamespace.func._getResponseFileContents(String fileHeader) in C:\Users\me\source\AppName\func.cs:line ...
2022-01-31 00:10:37.364 <GUID>: Function 'MyOrchestrator (Orchestrator)' failed with an error. Reason: Microsoft.Azure.WebJobs.Extensions.DurableTask.FunctionFailedException: The activity function 'PollForResponseAndDownload' failed: "RESPONSE_FILE_NOT_YET_AVAILABLE". See the function execution logs for additional details. ---> System.Exception: RESPONSE_FILE_NOT_YET_AVAILABLE at ...

以下是相關討論的幾個鏈接。 您能否嘗試根據此鏈接重新檢查您的 function 應用程序以解決您的問題。

  • 當調用DurableOrchestrationContext時, CallActivityWithRetryAsync調用DurableTask 框架OrchestrationContext class 的ScheduleWithRetry方法。
  • 調用RetryInterceptor class 上的Invoke方法,並在最大重試次數上執行 foreach 循環。 此 class 不公開獲取重試次數的屬性或方法。

活動 function 將“活動 function 'SomeActivityFunc' failed:”添加到消息中。 因此,要么創建要拋出的自定義異常類型並檢查類型,使用.Contains 或檢查“Activity function 'SomeActivityFunc' failed: RESPONSE_FILE_NOT_YET_AVAILABLE”。

Handle = ex => ex.Message == "Activity function 'SomeActivityFunc' failed: " + RETRY_ERROR_MESSAGE
Handle = ex => ex.Message.Contains(RETRY_ERROR_MESSAGE)
Handle = ex => ex is SomeCustomExceptionType

暫無
暫無

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

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