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

时间:2019-03-01 12:30:06

标签: node.js azure azure-functions azure-eventgrid

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

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

下图是该体系结构的简化版本,事件网格当然也会将事件发布到其他函数,但是为了简单起见……

我目前面临的挑战是,在触发第一个功能后,来自外部供应商的原始Webhook HTTP请求的上下文将丢失。尝试将上下文作为事件有效内容的一部分发送到Event Grid感觉像是一种反模式,并且无论我如何无法使其正常工作(.done()函数在事件中的某个位置丢失)。尝试仅在上一个函数中使用context.res = {}context.done()不会响应供应商的原始HTTP请求。

这里有什么想法吗?整个架构只是一个大的反模式吗?它甚至可以工作吗?还是我必须立即在由供应商的请求触发的第一个功能中发送HTTP响应?

谢谢! Minimal illustration of architecture

1 个答案:

答案 0 :(得分:1)

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

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

但是,有几种方法可以“逻辑”整合这两种不同的模式,以下显示其中一些:

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

  2. 使用具有轮询状态请求-响应消息交换模式。基本上,您的第一个函数将等待订阅者状态,然后返回到调用者。在分布式Internet体系结构中,我们可以使用azure租用blob存储在同步部分和异步事件部分之间共享状态。 在您的方案中,第一个AF将创建此租用Blob,然后向AEG触发一个事件,然后它将定期轮询租用Blob中的状态以结束聚合过程(多个订户等)。

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

以下屏幕片段显示了一个序列图,该序列图使用Azure租约Blob在分布式模型中共享“请求状态”。请注意,这种伪同步/异步模式适用于在不到60秒的短时间内处理请求-响应的情况。

enter image description here

有关在Azure函数中使用租约Blob的更多详细信息,请参见我的答案here