你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

在 Azure 事件网格中路由 MQTT 消息

事件网格允许将 MQTT 消息路由到 Azure 服务或 Webhook 以进一步处理。 相应地,你可以通过将 IoT 数据用于数据分析、存储和可视化及其他用例来生成端到端解决方案。

MQTT 消息路由的示意图。

如何使用路由功能?

将来自客户端的消息路由到 Azure 服务或自定义终结点可以最大程度地利用这些数据。 下面是利用此功能的众多用例中的一部分:

  • 数据分析:在客户端中提取并分析路由的消息,以优化解决方案。 例如,通过分析机器的遥测数据,以预测何时在故障发生之前安排维护,以避免延迟和进一步损坏。
  • 无服务器应用程序:根据来自客户端的路由消息触发无服务器函数。 例如,当运动传感器检测到运动时,向安全人员发送通知来处理此问题。
  • 数据可视化:为来自客户端的路由数据生成可视化效果,以便轻松呈现和理解数据,并突出显示趋势和离群值。

路由配置:

通过路由配置,可以将所有 MQTT 消息从客户端发送到事件网格命名空间主题事件网格自定义主题。 消息进入主题后,可以将事件订阅配置为使用主题中的消息。 使用以下概要步骤来实现此配置:

  • 以命名空间主题作为路由目标:
    • 创建事件网格命名空间主题,所有 MQTT 消息都将路由到其中。
    • 创建推送类型的事件订阅,以将这些消息路由到受支持的 Azure 服务之一、自定义 Webhook 或队列类型的事件订阅,以通过应用程序直接从命名空间主题拉取消息。
    • 参考你在第一个步骤中创建的主题设置路由配置

MQTT 消息路由到命名空间主题的关系图。

MQTT 消息路由到自定义主题的关系图。

注意

禁用命名空间的公用网络访问将导致 MQTT 路由失败。

以命名空间主题作为路由目标和以自定义主题作为路由目标之间的差异

下表显示了以命名空间主题和自定义主题作为路由目标之间的差异。 有关每个事件网格资源中包含的配额和限制的详细信息,请参阅《配额和限制》。

比较点 命名空间主题 自定义主题
吞吐量 高,最多 40 MB/s(入口)和 80 MB/s(出口) 低,最多 5 MB/s(流入量和流出量)
拉取传递
针对事件中心的推送传递
推送发送到 Azure 服务(Functions、Webhook、服务总线队列和主题、中继混合连接和存储队列)
消息保留期 7 天 1 天
角色分配要求 不需要,因为 MQTT 代理和命名空间主题位于同一命名空间下 需要,因为托管 MQTT 代理功能的命名空间和自定义主题是不同的资源

事件网格自定义主题的路由要求

用于路由的事件网格自定义主题需要满足以下要求:

  • 需要设置为使用云事件架构 v1.0
  • 需要与命名空间位于同一区域。
  • 在应用路由配置之前,需要将“事件网格数据发送方”角色分配给自己或事件网格自定义主题上的所选托管标识。
    • 在门户中,转到创建的事件网格主题资源。
    • 在“访问控制 (IAM)”菜单项中,选择“添加角色分配”。
    • 在“角色”选项卡中选择“事件网格数据发送者”,然后选择“下一步”。
    • 在“成员”选项卡中选择“+ 选择成员”,然后在显示的“选择”框中键入你的 AD 用户名(例如 user@contoso.com)。
    • 选择你的 AD 用户名,然后选择“查看 + 分配”

Azure 门户配置

使用以下步骤配置路由:

  • 在 Azure 门户中转到你的命名空间。
  • 在“路由”下,选中“启用路由”。
  • 在主题类型下,选择“命名空间主题”或“自定义主题”
  • 在“主题”下,选择已创建的且所有 MQTT 消息将路由到其中的主题。
  • 如果选择了自定义主题,则将显示“用于发送的托管标识”部分。 为标识选择以下选项之一,该标识将用于传送 MQTT 消息到自定义主题时对 MQTT 代理进行身份验证:
    • 无:在这种情况下,需要在自定义主题上将“事件网格数据发送方”角色分配给自己。
    • 系统分配的标识:在这种情况下,需要在命名空间上启用系统分配的标识作为先决条件,并将“EventGrid 数据发送者”角色分配给自定义主题上系统分配标识。
    • 用户分配的标识:在这种情况下,需要在命名空间上启用用户分配的标识作为先决条件,并将“EventGrid 数据发送者”角色分配给自定义主题上的所选标识。
      • 如果选择了用户分配的标识,则会显示一个下拉列表来支持你选择所需的标识。
  • 选择“应用”。

显示通过门户配置路由的屏幕截图。

有关扩充配置的说明,请参阅门户配置扩充

Azure CLI 配置

az resource create --resource-type Microsoft.EventGrid/namespaces --id /subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.EventGrid/namespaces/<Namespace Name> --is-full-object --api-version 2023-06-01-preview --properties @./resources/NS.json

NS.json

"properties": {
	"inputSchema": "CloudEventSchemaV1_0",
	"topicSpacesConfiguration": {
	    "state": "Enabled",           
	    "routeTopicResourceId": "/subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.EventGrid/topics/<Event Grid topic name>",
        "routingIdentityInfo": {
                "type": "UserAssigned", //Allowed values: None, SystemAssigned, UserAssigned
                "userAssignedIdentity": "/subscriptions/<Subscription ID>/resourceGroups/<Resource Group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<User-assigned identity>" //needed only if UserAssigned was the value of type
            },

	}
}

有关扩充配置的说明,请参阅 CLI 配置扩充

MQTT 消息路由行为

将 MQTT 消息路由到自定义主题时,事件网格会尝试立即传递每条消息至少一次并提供持久传递。 如果失败,事件网格会重试传递或丢弃要路由的消息。 事件网格不保证事件传送的顺序,因此订阅者可能会收到不按顺序的事件。

下表基于不同的错误描述 MQTT 消息路由的行为。

错误 错误说明 行为
TopicNotFoundError 已删除配置为接收所有 MQTT 路由消息的自定义主题。 事件网格丢弃了要路由的 MQTT 消息。
AuthenticationError 已删除配置为 MQTT 路由消息的目标的自定义主题的事件网格数据发送方角色。 事件网格丢弃了要路由的 MQTT 消息。
TooManyRequests 每秒 MQTT 路由消息数超过自定义主题的发布限制。 事件网格重新尝试路由 MQTT 消息。
ServiceError 因服务器操作原因发生意外服务器错误。 事件网格重新尝试路由 MQTT 消息。

重试期间,事件网格在 MQTT 消息路由中使用了指数退避重试策略。 事件网格会尽量按以下计划重试传送:

  • 10 秒
  • 30 秒
  • 1 分钟
  • 5 分钟
  • 10 分钟
  • 30 分钟
  • 1 小时
  • 3 小时
  • 6 小时
  • 每 12 小时一次

如果排队等待重新传送的路由 MQTT 消息成功传送,事件网格会尽力从重试队列中删除该消息,但仍可能会收到重复项。

后续步骤:

使用以下文章详细了解路由:

快速入门:

概念: