You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Durable Function(独立模式)Rewind操作不可用,如何重执行失败实例最后步骤

Azure Durable Functions Isolated模式下Rewind操作的替代方案

Durable Functions Isolated模式已移除InProcess模式中的Rewind操作,没有直接的一对一替代,但可以通过以下两种核心方式实现类似的故障恢复需求:

一、替代Rewind的两种核心方案

1. 使用ContinueAsNew重置实例

如果业务允许重置实例状态并从头执行(可保留关键输入),可以调用ContinueAsNew方法。它会终止当前实例,以相同ID启动新实例,并传入更新后的输入参数。示例代码:

[FunctionName("MyOrchestrator")]
public static async Task RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    try
    {
        await context.CallActivityAsync("Step1", context.GetInput<MyInput>());
        await context.CallActivityAsync("Step2", someData);
    }
    catch (Exception ex)
    {
        if (IsRetryable(ex)) // 自定义判断是否需要重试的逻辑
        {
            var updatedInput = AdjustInputForRetry(context.GetInput<MyInput>());
            await context.ContinueAsNew(updatedInput);
        }
        else
        {
            throw;
        }
    }
}

2. 手动实现步骤追踪与重试

若只需重新执行失败步骤,可在编排中为关键步骤添加重试策略,同时通过自定义状态记录已完成的步骤,避免重复执行:

[FunctionName("MyOrchestrator")]
public static async Task RunOrchestrator(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    var executionState = context.GetInput<ExecutionState>() ?? new ExecutionState();

    if (!executionState.Step1Completed)
    {
        await context.CallActivityWithRetryAsync("Step1", 
            new RetryOptions(TimeSpan.FromSeconds(5), 3), 
            executionState.InputData);
        executionState.Step1Completed = true;
        await context.SetCustomStatusAsync(executionState);
    }

    if (executionState.Step1Completed && !executionState.Step2Completed)
    {
        try
        {
            await context.CallActivityAsync("Step2", executionState.InputData);
            executionState.Step2Completed = true;
            await context.SetCustomStatusAsync(executionState);
        }
        catch (Exception ex)
        {
            // 根据错误类型决定是否重试或抛出
            throw;
        }
    }
}

public class ExecutionState
{
    public bool Step1Completed { get; set; }
    public bool Step2Completed { get; set; }
    public MyInput InputData { get; set; }
}

二、实例失败时重新执行最后一步的操作方式

当实例处于失败状态时,没有原生的"重新执行最后一步"功能,可通过以下方式实现:

  • 基于状态追踪重启:复用上述ExecutionState记录,启动新实例(或复用原ID)并传入保存的执行状态,编排逻辑会自动跳过已成功步骤,仅执行失败的最后一步。
  • 分析执行历史重放步骤:通过Durable Client获取实例执行历史,识别最后失败的活动后单独执行:
[FunctionName("ReplayFailedStep")]
public static async Task ReplayFailedStep(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "replay/{instanceId}")] HttpRequest req,
    string instanceId,
    [DurableClient] IDurableOrchestrationClient client)
{
    var history = await client.GetInstanceHistoryAsync(instanceId);
    var lastFailedActivity = history.LastOrDefault(h => h.EventType == EventType.ActivityFailed);
    
    if (lastFailedActivity != null)
    {
        var activityName = ((ActivityFailedEvent)lastFailedActivity).Name;
        var input = ((ActivityFailedEvent)lastFailedActivity).Input;
        
        // 重新执行失败的活动(需确保该活动可独立执行)
        await client.CallActivityAsync(activityName, input);
    }
}

注意:Isolated模式与InProcess模式的Durable API存在差异,迁移时需重新梳理错误处理和重试逻辑,建议结合业务场景选择最合适的方案。

内容的提问来源于stack exchange,提问作者Michson07

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 03:12:42