从另一个Azure功能启动Azure功能的最佳实践

时间:2017-08-01 15:14:08

标签: c# azure http azure-functions

我有一个场景,我有两个函数,比如函数A和函数B.

目前,功能A和功能B都具有相同的逻辑,用于记录失败的活动,其中元数据记录到表存储,JSON记录到Blob存储。

编辑 - >功能A和功能B位于两个不同的功能应用程序(预期)中。功能A在消费计划上,功能B在应用服务计划上。

第一个问题 - 创建一个功能C并从A和B中获取失败的活动记录逻辑并将其放入C中是否有意义?

这会删除代码重复,并且逻辑位于一个易于管理的位置。

第二个问题 - 从A和B调用函数C的最佳方法是什么?

我已阅读here,最好使用存储队列或服务总线进行功能之间的交叉通信。我遇到的问题是 - 我需要存储的JSON在大多数情况下会超过256KB,所以我不能把它放在一个队列来触发一个Function。

那么,函数C可以是HTTP触发器吗?我发送的请求包含从函数A和B通过HTTP登录所需的所有相关信息?

有没有理由不这样做?

非常感谢。

3 个答案:

答案 0 :(得分:11)

为了将来参考(以及那些可能通过网络搜索找到此问题的人),我们为Azure功能构建了一个新的link扩展,允许从另一个函数调用一个函数。您的具体问题可能编码如下:

public static async Task<object> Run(DurableOrchestrationContext ctx)
{
    try
    {
        var result = await ctx.CallActivityAsync<object>("FunctionA");
        var y = await ctx.CallActivityAsync<object>("FunctionB", result);
        return y;
    }
    catch (Exception e)
    {
        // error handling/compensation goes here
        await ctx.CallActivityAsync<object>("FunctionC", e);
        return null;
    }
}

功能A 功能B Durable Functions,可以存在于同一个功能应用中。上面调度它们的函数是activity functions。消费和应用服务计划均受支持。

在{$ 1}}方法下,CallActivityAsync方法通过Azure存储队列发送消息,以按名称触发指定的函数。通过自动切换到队列和blob的组合来支持大消息,以确保它们可以可靠地传送。

然而,一个重要的约束是必须在同一个功能应用程序中定义FunctionA和FunctionB。因此,它与您的问题不完全匹配。对于那些能够将功能保存在同一个功能应用程序中的人来说,它是一个很好的解决方案。

官方文档orchestrator function

GitHub https://docs.microsoft.com/en-us/azure/azure-functions/durable-functions-overview

答案 1 :(得分:3)

功能链的推荐模式是使用队列(SB /存储队列),其中一个函数输出到另一个输入队列,其中一条消息携带要处理的有效负载。

这使您的功能保持小巧,快速和分离,同时利用所有适用于配置,扩展和故障处理的逻辑。

答案 2 :(得分:0)

我想你可能会过度思考这个问题。是的,您可以从函数调用函数,但这很昂贵,因为您必须跨越进程边界,尤其是对于像日志记录这样的潜在高容量。

我所做的是在程序集中构建共享逻辑,然后上传程序集并从函数中调用它。 Here is a blog post that shows you how

Here is a related post on logging in Azure functions as you may hit the same challenges.