共用方式為


Durable Functions (Azure Functions) 中的永久性協調流程

永恆協調流程 是永無止境的協調器功能。 當您想要將 Durable Functions 用於彙總器,以及任何需要無限迴圈的案例時,它們很有用。

協調流程歷程記錄

協調流程歷程記錄 主題中所述,持久工作架構會追蹤每個函式協調流程的歷程記錄。 只要協調器函式繼續排程新的工作,此記錄就會持續成長。 如果協調器函式進入無限迴圈並持續排程工作,此歷程記錄可能會變得非常大,並導致重大的效能問題。 永恆編排概念旨在減輕需要無限循環的應用程式的此類問題。

重設並重新啟動

協調器函式會呼叫協調流程觸發程序繫結continue-as-new 方法來重設其狀態,而不會使用無限迴圈。 這個方法會採用 JSON 可序列化參數,該參數會成為下一個協調器函式產生的新輸入。

當您呼叫 continue-as-new 時,協調流程執行個體會使用新的輸入值重新啟動自身。 會保留相同的實例 ID,但會重設協調器函式的歷史記錄。

永恆編排考量因素

在協調流程中使用 continue-as-new 方法時,請留意下列注意事項:

  • 當協調器函式透過 continue-as-new 方法重設時,長期工作架構會保留相同的執行個體識別碼,但內部會建立並使用新的執行識別碼來處理後續任務。 此執行識別碼不會在外部公開,但在偵錯協調流程執行時可能很有用。

  • 當執行期間發生未處理的例外狀況時,協調流程會進入 失敗 狀態,而且執行會終止。 在此狀態下,由 try-catch 陳述式的 finally 區塊發出的 continue-as-new 呼叫無法重新啟動協調流程。

這很重要

如果在執行期間協調流程遇到未攔截的例外狀況,則協調流程會進入「失敗」狀態,而且執行將會完成。 特別是,這表示即使在 區塊中呼叫 finally,在未攔截的例外狀況下也「不會」重新啟動協調流程。

定期工作範例

永恆協調流程的一個用例是需要無限期地執行定期工作的程式碼。

[FunctionName("Periodic_Cleanup_Loop")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    await context.CallActivityAsync("DoCleanup", null);

    // sleep for one hour between cleanups
    DateTime nextCleanup = context.CurrentUtcDateTime.AddHours(1);
    await context.CreateTimer(nextCleanup, CancellationToken.None);

    context.ContinueAsNew(null);
}

備註

上一個 C# 範例適用於 Durable Functions 2.x。 針對 Durable Functions 1.x,您必須使用 DurableOrchestrationContext 而非 IDurableOrchestrationContext。 如需版本間差異的詳細資訊,請參閱 Durable Functions 版本 一文。

此範例與計時器觸發函式之間的差異在於,清除觸發時間不是以排程為基礎。 例如,每小時執行函式的 CRON 排程會在 1:00、2:00、3:00 等時間點執行,很可能導致執行重疊的問題。 不過,在此範例中,如果清除需要 30 分鐘,則排程時間為 1:00、2:30、4:00 等,而且不會重疊。

啟動永恆管弦樂編排

使用 start-newschedule-new 持久性用戶端方法來啟動永恆協調流程,就像您處理任何其他協調流程函式一樣。

備註

如果您需要確保單一永久協調流程正在執行,請務必在啟動協調流程時維持相同的執行個體 id。 如需詳細資訊,請參閱 執行個體管理

[FunctionName("Trigger_Eternal_Orchestration")]
public static async Task<HttpResponseMessage> OrchestrationTrigger(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequestMessage request,
    [DurableClient] IDurableOrchestrationClient client)
{
    string instanceId = "StaticId";

    await client.StartNewAsync("Periodic_Cleanup_Loop", instanceId); 
    return client.CreateCheckStatusResponse(request, instanceId);
}

備註

先前的程式代碼適用於 Durable Functions 2.x。 針對 Durable Functions 1.x,請使用 OrchestrationClient 屬性而非 DurableClient 屬性,並使用 DurableOrchestrationClient 參數類型而非 IDurableOrchestrationClient。 如需版本間差異的詳細資訊,請參閱 Durable Functions 版本 一文。

從永久協調流程離開

如果協調器函式最終一定要完成,則您完全「不」需要呼叫 ContinueAsNew,讓函式自然結束即可。

如果協調器函式處於無限迴圈中,且需要停止,請使用協調流程用戶端繫結終止 API 來停止它。 如需詳細資訊,請參閱 執行個體管理

後續步驟