Azure功能的复杂性级别/责任

Azure功能的复杂性级别/责任,azure,azure-functions,azure-webjobs,Azure,Azure Functions,Azure Webjobs,我们正在将Azure WebJobs切换到Azure功能(除了本文之外,还有多种原因)。但我们内部无法就这些功能的架构达成一致 目前,我们有一个WebJob,它从a-Z执行单个任务。 例如,状态电子邮件:(从调度程序触发) 1.查找所有最近的文档 2.向所有这些人发送电子邮件 3.记录每个收件人的成功/失败 4.记录整个运行的成功/失败 我们有多个web作业可以执行类似的任务 现在我们有3种方法可以在将来实现这一点 一对一转换。将完整的WebJob功能移动到一个Azure功能中 将上述进程拆分为

我们正在将Azure WebJobs切换到Azure功能(除了本文之外,还有多种原因)。但我们内部无法就这些功能的架构达成一致

目前,我们有一个WebJob,它从a-Z执行单个任务。
例如,状态电子邮件:(从调度程序触发)
1.查找所有最近的文档
2.向所有这些人发送电子邮件
3.记录每个收件人的成功/失败
4.记录整个运行的成功/失败

我们有多个web作业可以执行类似的任务

现在我们有3种方法可以在将来实现这一点

  • 一对一转换。将完整的WebJob功能移动到一个Azure功能中
  • 将上述进程拆分为4个不同的Azure函数。例如,查找收件人,然后调用另一个发送电子邮件的功能,等等
  • 将所有WebJob合并到一个Azure函数中

  • 就个人而言,我倾向于解决方案3。但有些团队成员倾向于1。你觉得怎么样?

    我也会选择选项3。您可以使用持久功能,让它控制工作流,并为每个步骤(1-4)创建活动

    [函数名(“链接”)]
    公共静态异步任务运行(
    [OrchestrationTrigger]IDurableOrchestrationContext(上下文)
    {
    尝试
    {
    var recipients=wait context.CallActivityAsync(“GetAllRecipients”,null);
    foreach(收件人中的var收件人)
    {
    //可能返回一个复杂对象,其中包含有关故障的更多信息
    var success=wait context.CallActivityAsync(“发送电子邮件”,收件人);
    如果(!成功)
    {
    wait context.CallActivityAsync(“LogError”,收件人);
    }
    }
    返回wait context.CallActivityAsync(“NotifyCompletion”,null);
    }
    捕获(例外情况除外)
    {
    //这里是错误处理或补偿。
    wait context.CallActivityAsync(“LogError”,ex);
    }
    }
    

    更多信息:

    谢谢。有任何反对方法1的具体论据吗?我想这将更难排除故障,因为你有一个函数的输出作为下一个函数的输入,使用持久的函数更容易识别整个工作流。我的同事的评论是“单一责任原则”,但我并不真的同意Azure函数级别的观点。但很难争辩:-)
    [FunctionName("Chaining")]
    public static async Task<object> Run(
        [OrchestrationTrigger] IDurableOrchestrationContext context)
    {
        try
        {
            var recipients = await context.CallActivityAsync<object>("GetAllRecipients", null);
            foreach(var recipient in recipients)
            {
                //maybe return a complex object with more info about the failure
                var success = await context.CallActivityAsync<object>("SendEmail", recipient); 
                if (! success)
                {
                    await context.CallActivityAsync<object>("LogError", recipient);
                }
            }
    
            return  await context.CallActivityAsync<object>("NotifyCompletion", null);
        }
        catch (Exception ex)
        {
            // Error handling or compensation goes here.
            await context.CallActivityAsync<object>("LogError", ex);
        }
    }