通过事件网格从 Azure Functions 传递 HTTP 请求

Pass HTTP request from Azure Function through Event Grid

我已经开始考虑要基于 Azure Functions 和事件网格构建的系统的原型架构。

我想要实现的是拥有一个单一的入口点(功能),各种外部供应商将向其发送 Webhook (GET) HTTP 请求。该函数的目的是向负载添加一些元数据,并将包(元数据 + 来自供应商的原始负载)发布到事件网格。然后,事件网格将触发另一个函数,其目的是响应原始 Webhook HTTP 请求,例如状态 204 HTTP 代码。

下图是简化版的架构,Event Grid当然也会发布事件给其他Functions,但是为了简单起见...

我目前面临的挑战是,在第一个函数被触发后,来自外部供应商的原始 Webhook HTTP 请求的上下文丢失了。尝试将上下文作为事件负载的一部分发送到事件网格感觉像是一种反模式,而且无论如何我都无法让它工作(.done() 函数在事件中的某处丢失)。尝试在最后一个函数中仅使用 context.res = {}context.done() 将不会响应供应商的原始 HTTP 请求。

有什么想法吗?整个架构是否只是一个大的反模式——它还能工作吗?或者我是否必须立即在供应商请求触发的第一个函数中发送 HTTP 响应?

谢谢!

您正在混合两种不同的模式,例如消息驱动和事件驱动。 Azure 事件网格是一种分布式 Pub/Sub 事件推送模型,其中订阅者以松散解耦的方式订阅对源的兴趣。

在您的方案中,您希望以同步方式在消息交换请求-响应模式中使用事件模型。请求消息交换上下文无法通过 Pub/Sub 事件模型流回匿名端点,例如响应消息的实际点。

但是,有几种方法可以"logical" 整合这两种不同的模式,下面展示了其中的一些:

  1. 使用 request - replyTo 消息交换模式,例如全双工通信,一个用于 request,另一个用于 replyTo。

  2. 使用具有轮询状态请求-响应消息交换模式。基本上,您的第一个函数将等待订阅者状态,然后 return 返回给调用者。在分布式互联网架构中,我们可以使用 azure lease blob storage 在同步部分和异步事件部分之间共享状态。 在您的场景中,第一个 AF 将创建这个租约 blob,然后向 AEG 触发一个事件,然后它将定期轮询租约 blob 中的状态以结束聚合过程(多个订阅者等)。

    此外,对于这种模式,您可以使用 Azure Durable Function 来简化与事件驱动 AEG 模型的集成。

以下屏幕片段显示了使用 Azure 租赁 Blob 在分布式模型中共享 "Request State" 的序列图。请注意,此伪 sync/async 模式适用于请求-响应在小于 60 秒的短时间内处理的情况。

有关在 Azure 函数中使用 Lease Blob 的更多详细信息,请参阅我的回答