如何根据消息类型将事件中心消息路由到不同的 Azure 函数

How to route Event Hub messages to different Azure functions based on their message type

我有一个 Azure 事件中心,我想通过它发送各种类型的消息。每条消息都应根据消息类型由单独的 Azure Functions 处理。实现此目标的最佳方法是什么?

实际上,我可以用 typepayload 属性 创建一些 JSON 容器,然后让一个父级 Azure 函数将所有消息有效负载(基于它们的类型)分派给其他函数,但这感觉有点老套。

basically asks the same - however it is answered how it can be done using the IoT Hub and message routing。在事件中心配置中,我找不到任何用于配置消息路由的设置。

或者我应该切换到 Azure 消息队列来获得此功能吗?

我会使用 Azure Streaming Analytics 将其路由到不同的 Azure Functions。 ASA 允许您将事件中心指定为源和多个接收器(其中一个可以是多个 Azure Functions)。您可以阅读有关通过 Azure 门户 here. You'll need to set up the Event Hub as your source (docs). You'll also need to set up your sink (docs 设置 Azure 流分析服务的更多信息。您编写一些 MS SQL-like 代码来将消息路由到各种接收器。但是,ASA 相对于其他服务而言成本较高,因为您需要为固定数量的计算付费。

我在下面放了一些伪代码。您必须使用随附的 MS 文档中的信息根据您配置 ASA 的方式将其换掉。

SELECT
    *
INTO
    [YourOutputAlias]
FROM
    [YourInputAlias]
HAVING
    [CONDITION]

SELECT
    *
INTO
    [YourAlternateOutputAlias]
FROM
    [YourInputAlias]
HAVING
    [CONDITION]

根据您关于业务需求的附加信息并假设事件大小 < 64KB(预览版为 1MB),以下屏幕片段显示了您的解决方案示例:

上述解决方案的概念是基于将一批事件推送到 AEG 的事件域端点。 EventHub Trigger 函数负责在发布到 AEG 之前将批处理中的每个事件消息类型映射到域主题。

请注意,使用 Azure IoT 中心获取事件,AEG 可以直接集成到 IoT 中心,并且每个事件消息可以松散解耦 Pub/Sub 方式分发。除此之外,对于此业务需求,与基本事件中心(11.16 美元)相比,IoT 中心可以使用 B1 规模层(10 美元/月)。 IoT 中心具有 built-in 消息路由机制(有一些限制),但 IoT/AEG 集成的最近新功能(例如发布设备遥测消息)在无服务器架构中提供了良好的支持。

我最终使用 Azure Durable Functions 并使用 Fan Out/Fan In 模式。

在这种方法中,所有事件都由一个 Orchestrator 函数处理,该函数实际上是一个 Durable Azure Function (F1)。这会将传入的 JSON 反序列化为正确的 DTO。根据 DTO 的内容,调用相应的 activity 函数 (F2) 对其进行处理。