Azure 函数:使用 Http 触发器而不是 Blob 触发器来实现更有弹性的操作

Posted

技术标签:

【中文标题】Azure 函数:使用 Http 触发器而不是 Blob 触发器来实现更有弹性的操作【英文标题】:Azure Function: Http Trigger instead of Blob Trigger for more resilient operations 【发布时间】:2018-10-25 19:24:06 【问题描述】:

我有一个场景,我将一些数据写入一个 azure 存储 blob,触发一个 azure 函数来处理数据,并将结果写入另一个 blob 存储记录。我遇到了一个奇怪的场景,如果函数有一段时间(几天)没有触发,它将停止响应触发器,除非我导航到 azure 门户并重新启动函数。当我使用 VSTS 在我的 CI/CD 管道中发布函数时,也会发生这种情况。同样,需要重新启动。

为了解决这个问题,我更喜欢使用 HTTP 触发器,这样我至少可以获得对我的请求的状态代码响应,并且更好地了解我的函数实际上已被触发。

这是正在工作的 blob 触发器的方法:

[FunctionName("ProcessOpenOrders")]
public static async Task Run([BlobTrigger("%TriggerBlobPath%/name")]Stream myBlob, string name, TraceWriter traceWriter, [Blob("%OutboundBlobPath%/name", FileAccess.Write)] Stream outputStream, ExecutionContext context)

TriggerBlobPath 和 OutboudBlobPath 是槽设置配置。这很重要,因为我需要将 blob 存储记录名称作为参数,这样我就知道要读取什么,并且我使用与输出相同的记录名称。

对于 HTTP 触发器,我需要以类似方式使用该名称。我的问题是怎么做?

我猜是这样的:

public static async Task Run([HttpTrigger] HttpRequestMessage request, [Blob("%InboundBlobPath%/name", FileAccess.Read)]Stream myBlob, string name, TraceWriter traceWriter, [Blob("%OutboundBlobPath%/name", FileAccess.Write)] Stream outputStream, ExecutionContext context)

但我收到以下错误:

Microsoft.Azure.WebJobs.Host: Unable to resolve binding parameter 'name'. Binding expressions must map to either a value provided by the trigger or a property of the value the trigger is bound to, or must be a system binding expression (e.g. sys.randguid, sys.utcnow, etc.).

如果有人知道如何实现 HttpTrigger 代替 blob 触发器,但获得相同的功能,那将非常有帮助。否则,如果有人知道如何保证 Blob 触发器确实被触发,那也会很有帮助。

谢谢!

【问题讨论】:

是绑定问题吗? 【参考方案1】:

我认为官方的指导是使用事件网格触发器来对 blob 事件做出反应。请参阅Reacting to Blob storage events 和Event Grid trigger for Azure Functions。

【讨论】:

谢谢。我想研究这个,看看我是否可以获得额外的好处。我也在考虑尝试逻辑应用方法。

以上是关于Azure 函数:使用 Http 触发器而不是 Blob 触发器来实现更有弹性的操作的主要内容,如果未能解决你的问题,请参考以下文章

来自另一个帐户中的事件中心的 Azure 函数触发器

保护非 Http 触发的 Azure 函数,如服务总线触发器

如何强制我的本地 Azure 函数服务器使用 HTTP 2.0 而不是 1.1?

Http 触发器启用 Azure 函数超时

数据工厂中使用的 Python Azure 函数返回:“响应内容不是有效的 JObject”

Azure 函数 Http 触发器验证正文数据