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

chr*_*ris 2 c# http azure azure-functions

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

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

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

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

这消除了代码重复,逻辑在一个地方,更容易管理.

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

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

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

有什么理由不这样做吗?

非常感谢.

Chr*_*lum 11

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

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

FunctionAFunctionB是可以存在于同一功能应用程序中的活动功能.上面调度它们的函数是一个orchestrator函数.消费和应用服务计划均受支持.

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

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

官方文档:https://docs.microsoft.com/en-us/azure/azure-functions/durable-functions-overview

GitHub:https://github.com/Azure/azure-functions-durable-extension


Fab*_*nte 5

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

这可以使您的功能保持小型、快速和解耦,同时利用所有逻辑来进行配置、扩展和故障处理。