【问题标题】:Azure Durable Function Activity Trigger Required?需要 Azure 持久功能活动触发器吗?
【发布时间】:2018-07-26 16:48:06
【问题描述】:

我有一个简单的持久函数,我的目标是执行一些后台工作(在这种情况下启动 Azure 数据库)。

我有以下代码正在运行,但是我想知道需要 ActivityTrigger 函数的目的是什么。

如果我不包含它并尝试在 CreateDB 本身中工作,则持久功能永远不会正确完成并保持运行状态。

public static class CreateDBFn
{
    private const string CreateDBConstant = "CreateDB";
    private const string CreateDBTaskConstant = CreateDBConstant + "Task";

    [FunctionName(CreateDBConstant + "Start")]
    public static async Task<HttpResponseMessage> Run(
   [HttpTrigger(AuthorizationLevel.Function, methods: "post", Route = CreateDBConstant + "/{Name}")] HttpRequestMessage req,
   [OrchestrationClient] DurableOrchestrationClientBase starter,
   string Name,
   ILogger log)
    {
        string instanceId = await starter.StartNewAsync(CreateDBConstant, Name);

        log.LogInformation($"Started orchestration with ID = '{instanceId}'.");

        var res = starter.CreateCheckStatusResponse(req, instanceId);
        res.Headers.RetryAfter = new RetryConditionHeaderValue(TimeSpan.FromSeconds(10));
        return res;
    }

    [FunctionName(CreateDBConstant)]
    public static async Task<bool> CreateDB([OrchestrationTrigger] DurableOrchestrationContextBase context)
    {
        var Name = context.GetInput<string>();

        // I'd like to just do work here
        await Task.Delay(30000);

        // Why is it required to call out to an Activity?
        var success = await context.CallActivityAsync<bool>(CreateDBTaskConstant, Name);

        return true;
    }

    [FunctionName(CreateDBTaskConstant)]
    public static async Task<bool> CreateDBTask([ActivityTrigger] string Name)
    {
        // preform work
        await Task.Delay(30000);

        return true;
    }
}

【问题讨论】:

    标签: azure-functions


    【解决方案1】:

    不鼓励在编排器代码中启动异步操作,唯一的例外是由持久编排上下文启动的代码,例如 CallActivityAsync()。这是由于协调器函数的检查点重放行为。

    来自the documentation的相关摘录

    除非使用 DurableOrchestrationContext API,否则Orchestrator 代码不得启动任何异步操作。例如,没有 Task.Run、Task.Delay 或 HttpClient.SendAsync。持久任务框架在单个线程上执行编排器代码,并且无法与其他异步 API 可以调度的任何其他线程交互。

    可以在协调器函数中安全等待的任务有时称为持久任务。这些是由 Durable Task Framework 创建和管理的任务。例如 CallActivityAsync、WaitForExternalEvent 和 CreateTimer 返回的任务。

    【讨论】:

    • 所以只是为了确认这是调用上述代码的正确方法?我基本上需要 3 种方法来执行可以立即返回待处理结果的异步任务?
    • 是的,您需要编排器客户端(已触发)、编排器功能和实际执行工作的活动。不过,我不明白您为什么要使用编排器来执行不严格要求编排的逻辑。就您的目的而言,仅具有一个异步启动数据库的触发函数是否就足够了?
    • 但是我正在从一个 asp.net 端点开始创建数据库。在创建 dB 时,我无法可靠地运行后台任务或让线程等待。创建数据库可能需要几分钟,有意义吗?
    • 在我看来,我的目标是启动一个函数并让它返回一个可以检查进度的端点。我能做到这一点的唯一方法是使用我认为的上述持久功能流程
    • 当然,在这种情况下,编排器是有意义的。请注意,由于该过程可能需要几分钟,因此如果您在消耗计划中运行函数,则默认最大执行超时为 5 分钟(可以延长至 10 分钟),之后您的活动函数将终止。
    猜你喜欢
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2019-09-09
    相关资源
    最近更新 更多