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