我有一个场景,我有两个函数,比如函数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登录所需的所有相关信息?
有没有理由不这样做?
非常感谢。
答案 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。因此,它与您的问题不完全匹配。对于那些能够将功能保存在同一个功能应用程序中的人来说,它是一个很好的解决方案。
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.