使用 Azure 中的事件代理将从第三方 WebHooks 使用的数据流式传输到应用程序
Streaming data consumed from third-party WebHooks to application using an event broker in Azure
我目前正在开展一个项目,我需要在我的应用程序中使用第三方 Webhook。问题是,这个第三方服务不允许我选择通过这个 Webhook 将哪些事件推送到我的应用程序,所以我必须响应所有这些事件,即使它们大部分没用,而且如果我需要扩展我的应用程序或将其划分为微服务,我会将相同的数据流式传输到所有服务,即使它们有不同的需求。此外,如果我的应用程序服务器出现问题,我将面临数据丢失的问题。
解决方案是使用事件代理,它会从 Webhook 收集所有事件,用 200 OK 状态代码响应提供者,将事件推送到特定主题,该主题将被存储直到所有相关人员订阅的服务接收该数据。
我正在 Azure 中寻找完全托管的服务,到目前为止,我遇到过 Azure 事件网格、Azure 事件中心和 Azure 服务总线。
我想知道这种情况的可行性,以及我是否可以直接从 Webhook 流式传输到这些 Azure 服务之一。
不,据我所知,您不能直接流式传输到这些服务中。您将需要设置一些东西来接受 webhook 并将其发送到其中一个监听的服务。
但是,我要做的是创建一个 http triggered azure function。您应该能够将 webhook 配置为 post 函数。
设置完函数后,您可以在那里创建一些逻辑,以根据消息的内容将消息路由到适当的渠道。现在,它可以是您的应用程序、服务总线队列、Azure 存储队列或事件网格。我不会推荐事件中心,因为它不太适合这个特定目的。
在使用 third-party 事件但不保证其 按顺序处理 并且 webhook 负载是一个数组的情况下,Azure 事件网格可以使用您的 third-party直接webhook。
以下屏幕片段显示了此示例:
以上集成基于 自定义主题端点 和 CustomInputSchema。
自定义主题端点使用以下 HTTP 响应代码将响应发送回 webhook:
Success 200 OK
Event data has incorrect format 400 Bad Request
Invalid access key 401 Unauthorized
Incorrect endpoint 404 Not Found
Array or event exceeds size limits 413 Payload Too Large
AEG 模型以松散解耦 Pub/Sub 方式分发事件,并根据订阅者可靠地重试传递给订阅者。 AEG 订阅代表兴趣来源和消费者之间的逻辑连接。它是一组由消费者描述内容、地点和方式的元数据。
基本上有两种交付模式,例如:
Push-PushAck 其中事件被推送到订阅者处理程序以进行业务处理,结果返回到 AEG,例如Web Hook (Azure Function) 和混合连接。
Push-PullAck 其中事件可靠地传递给订阅者并且传递响应返回给 AEG。该事件必须从该交付目标中提取,用于其业务 post-processing,例如服务总线队列、存储队列和事件中心。
更新:
要使用 CustomInputSchema 创建自定义主题端点,例如可以使用 REST API
以下是负载 PUT 请求的示例:
{
"location": "westus",
"properties": {
"inputSchema": "CustomEventSchema",
"inputSchemaMapping": {
"properties": {
"id": {
"sourceField": null
},
"topic": {
"sourceField": null
},
"eventTime": {
"sourceField": null
},
"eventType": {
"sourceField": null,
"defaultValue": "notification"
},
"subject": {
"sourceField": null,
"defaultValue": "/webhook/events"
},
"dataVersion": {
"sourceField": null,
"defaultValue": "1.0"
}
},
"inputSchemaMappingType": "Json"
}
}
}
上面的 CustomInputSchema 允许为此自定义主题端点使用任何输入事件架构。这是 AEG 非常好的功能。 "bad news" 是事件必须在包含单个事件的数组中。我希望,当单个事件也可以作为 JObject(不在数组内部)发布时,AEG 团队将改进自定义和领域主题。
为了通过 AEG 事件模型绕过 输入事件模式,订阅者(源事件兴趣的消费者)必须声明一个 DeliverySchema = CustomInputSchema。默认输出事件架构是 EventGridSchema。
以下示例显示了使用 CustomInputSchema 发布到自定义主题并使用 CustomInptutSchema 和另一个带有 EventGridSchema.
触发自定义主题端点的事件(事件数组):
[
{
"abcd": 12345
}
]
DeliverySchema = CustomInputSchema 的订阅者:
{
"abcd": 12345
}
订阅者 DeliverySchema = EventGridSchema(默认架构):
{
"id": "f92a5dbf-d206-4e61-ac1e-7498c543039a",
"eventTime": "2019-07-14T07:19:00.3969337Z",
"eventType": "notification",
"dataVersion": "1.0",
"metadataVersion": "1",
"topic": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rk2012/providers/Microsoft.EventGrid/topics/testerTopic8",
"subject": "/webhook/events",
"data":
{
"abcd": 12345
}
}
请注意,可以根据每个订阅者的订阅属性以松散分离的 Pub/Sub 方式为每个订阅者 filtered(选择)事件。换句话说,订阅者可以随时通过其订阅来订阅 AEG 事件模型,其中声明了特定的来源兴趣,例如主题、主题、事件数据等,传递机制、重试、死信等
我目前正在开展一个项目,我需要在我的应用程序中使用第三方 Webhook。问题是,这个第三方服务不允许我选择通过这个 Webhook 将哪些事件推送到我的应用程序,所以我必须响应所有这些事件,即使它们大部分没用,而且如果我需要扩展我的应用程序或将其划分为微服务,我会将相同的数据流式传输到所有服务,即使它们有不同的需求。此外,如果我的应用程序服务器出现问题,我将面临数据丢失的问题。
解决方案是使用事件代理,它会从 Webhook 收集所有事件,用 200 OK 状态代码响应提供者,将事件推送到特定主题,该主题将被存储直到所有相关人员订阅的服务接收该数据。
我正在 Azure 中寻找完全托管的服务,到目前为止,我遇到过 Azure 事件网格、Azure 事件中心和 Azure 服务总线。
我想知道这种情况的可行性,以及我是否可以直接从 Webhook 流式传输到这些 Azure 服务之一。
不,据我所知,您不能直接流式传输到这些服务中。您将需要设置一些东西来接受 webhook 并将其发送到其中一个监听的服务。
但是,我要做的是创建一个 http triggered azure function。您应该能够将 webhook 配置为 post 函数。
设置完函数后,您可以在那里创建一些逻辑,以根据消息的内容将消息路由到适当的渠道。现在,它可以是您的应用程序、服务总线队列、Azure 存储队列或事件网格。我不会推荐事件中心,因为它不太适合这个特定目的。
在使用 third-party 事件但不保证其 按顺序处理 并且 webhook 负载是一个数组的情况下,Azure 事件网格可以使用您的 third-party直接webhook。
以下屏幕片段显示了此示例:
以上集成基于 自定义主题端点 和 CustomInputSchema。 自定义主题端点使用以下 HTTP 响应代码将响应发送回 webhook:
Success 200 OK
Event data has incorrect format 400 Bad Request
Invalid access key 401 Unauthorized
Incorrect endpoint 404 Not Found
Array or event exceeds size limits 413 Payload Too Large
AEG 模型以松散解耦 Pub/Sub 方式分发事件,并根据订阅者可靠地重试传递给订阅者。 AEG 订阅代表兴趣来源和消费者之间的逻辑连接。它是一组由消费者描述内容、地点和方式的元数据。
基本上有两种交付模式,例如:
Push-PushAck 其中事件被推送到订阅者处理程序以进行业务处理,结果返回到 AEG,例如Web Hook (Azure Function) 和混合连接。
Push-PullAck 其中事件可靠地传递给订阅者并且传递响应返回给 AEG。该事件必须从该交付目标中提取,用于其业务 post-processing,例如服务总线队列、存储队列和事件中心。
更新:
要使用 CustomInputSchema 创建自定义主题端点,例如可以使用 REST API 以下是负载 PUT 请求的示例:
{
"location": "westus",
"properties": {
"inputSchema": "CustomEventSchema",
"inputSchemaMapping": {
"properties": {
"id": {
"sourceField": null
},
"topic": {
"sourceField": null
},
"eventTime": {
"sourceField": null
},
"eventType": {
"sourceField": null,
"defaultValue": "notification"
},
"subject": {
"sourceField": null,
"defaultValue": "/webhook/events"
},
"dataVersion": {
"sourceField": null,
"defaultValue": "1.0"
}
},
"inputSchemaMappingType": "Json"
}
}
}
上面的 CustomInputSchema 允许为此自定义主题端点使用任何输入事件架构。这是 AEG 非常好的功能。 "bad news" 是事件必须在包含单个事件的数组中。我希望,当单个事件也可以作为 JObject(不在数组内部)发布时,AEG 团队将改进自定义和领域主题。
为了通过 AEG 事件模型绕过 输入事件模式,订阅者(源事件兴趣的消费者)必须声明一个 DeliverySchema = CustomInputSchema。默认输出事件架构是 EventGridSchema。
以下示例显示了使用 CustomInputSchema 发布到自定义主题并使用 CustomInptutSchema 和另一个带有 EventGridSchema.
触发自定义主题端点的事件(事件数组):
[
{
"abcd": 12345
}
]
DeliverySchema = CustomInputSchema 的订阅者:
{
"abcd": 12345
}
订阅者 DeliverySchema = EventGridSchema(默认架构):
{
"id": "f92a5dbf-d206-4e61-ac1e-7498c543039a",
"eventTime": "2019-07-14T07:19:00.3969337Z",
"eventType": "notification",
"dataVersion": "1.0",
"metadataVersion": "1",
"topic": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/rk2012/providers/Microsoft.EventGrid/topics/testerTopic8",
"subject": "/webhook/events",
"data":
{
"abcd": 12345
}
}
请注意,可以根据每个订阅者的订阅属性以松散分离的 Pub/Sub 方式为每个订阅者 filtered(选择)事件。换句话说,订阅者可以随时通过其订阅来订阅 AEG 事件模型,其中声明了特定的来源兴趣,例如主题、主题、事件数据等,传递机制、重试、死信等