在 Azure Durable Functions Orchestator 中使用异步辅助函数是否安全?

Gav*_*n H 9 azure azure-functions azure-durable-functions

我试图Non-Deterministic workflow detected: TaskScheduledEvent: 0 TaskScheduled ...在我们的持久功能项目中追踪一些偶然的错误。这种情况很少见(10,000 次左右的情况下为 3 次)。

将协调器代码与此处记录的约束进行比较时,我们使用了一种我不清楚的模式。为了使编排器代码更干净/可读,我们使用一些私有的异步辅助函数来进行实际CallActivityWithRetryAsync调用,有时包装在异常处理程序中以进行日志记录,然后await在此辅助函数上使用主编排器函数。

类似这个简化示例的东西:

[FunctionName(Name)]
public static async Task RunPipelineAsync(
    [OrchestrationTrigger]
    DurableOrchestrationContextBase context,

    ILogger log)
{
    // other steps

    await WriteStatusAsync(context, "Started", log);

    // other steps

    await WriteStatusAsync(context, "Completed", log);
}

private static async Task WriteStatusAsync(
    DurableOrchestrationContextBase context,
    string status,
    ILogger log
)
{
    log.LogInformationOnce(context, "log message...");
    try
    {
        var request = new WriteAppDocumentStatusRequest 
        {
            //...
        };

        await context.CallActivityWithRetryAsync(
            "WriteAppStatus",
            RetryPolicy,
            request
        );
    }
    catch(Exception e)
    {
        // "optional step" will log errors but not take down the orchestrator
        // log here
    }
}
Run Code Online (Sandbox Code Playgroud)

实际上,这些任务与Task.WhenAll. 有效期是要调用这些async尽管他们不是功能直接context

Chr*_*lum 6

是的,您正在做的事情是完全安全的,因为它仍然会导致确定性行为。只要您不进行任何自定义线程调度或调用具有自己独立异步回调的非持久 API(例如,网络 API 通常具有在单独线程上运行的回调),就可以了。

如果您不确定,我强烈建议您使用我们的Durable Functions C# 分析器来分析您的代码是否存在编码错误。这将有助于标记可能导致Non-deterministic workflow错误的任何编码错误。

更新

注意:当前版本的分析器将要求您向[Deterministic]私有异步函数添加一个属性,如下所示:

[Deterministic]
private static async Task WriteStatusAsync(
    DurableOrchestrationContextBase context,
    string status,
    ILogger log
)
{
   // ...
}
Run Code Online (Sandbox Code Playgroud)

这让它知道您的协调器功能正在使用私有异步方法,并且还需要对其进行分析。如果您使用 Durable Functions 1.8.3 或更低版本,则该[Deterministic]属性将不存在。但是,您可以使用相同的名称创建自己的自定义属性,并且分析器会遵守它。例如:

[Deterministic]
private static async Task WriteStatusAsync(
    DurableOrchestrationContextBase context,
    string status,
    ILogger log
)
{
   // ...
}

// Needed for the Durable Functions analyzer
class Deterministic : Attribute { }
Run Code Online (Sandbox Code Playgroud)

但是请注意,我们计划在[Deterministic]未来的版本中移除对该属性的需求,因为我们发现它实际上可能不是必需的。

  • 如果您要检查应用程序设置或环境变量,请确保在活动函数中而不是在协调器函数中执行此操作。这些确实属于“非确定性”类别(分析器应该标记这些 API)。 (2认同)