你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
在 Azure 事件网格中路由 MQTT 消息
事件网格允许将 MQTT 消息路由到 Azure 服务或 Webhook 以进一步处理。 相应地,你可以通过将 IoT 数据用于数据分析、存储和可视化及其他用例来生成端到端解决方案。
将来自客户端的消息路由到 Azure 服务或自定义终结点可以最大程度地利用这些数据。 下面是利用此功能的众多用例中的一部分:
- 数据分析:在客户端中提取并分析路由的消息,以优化解决方案。 例如,通过分析机器的遥测数据,以预测何时在故障发生之前安排维护,以避免延迟和进一步损坏。
- 无服务器应用程序:根据来自客户端的路由消息触发无服务器函数。 例如,当运动传感器检测到运动时,向安全人员发送通知来处理此问题。
- 数据可视化:为来自客户端的路由数据生成可视化效果,以便轻松呈现和理解数据,并突出显示趋势和离群值。
通过路由配置,可以将所有 MQTT 消息从客户端发送到事件网格命名空间主题或事件网格自定义主题。 消息进入主题后,可以将事件订阅配置为使用主题中的消息。 使用以下概要步骤来实现此配置:
- 以命名空间主题作为路由目标:
- 创建事件网格命名空间主题,所有 MQTT 消息都将路由到其中。
- 创建推送类型的事件订阅,以将这些消息路由到受支持的 Azure 服务之一、自定义 Webhook 或队列类型的事件订阅,以通过应用程序直接从命名空间主题拉取消息。
- 参考你在第一个步骤中创建的主题设置路由配置。
- 以自定义主题作为路由目标:
- 创建事件网格自定义主题,所有 MQTT 消息都将路由到其中。 此主题需要满足事件网格自定义主题的路由要求
- 创建事件网格事件订阅,以将这些消息路由到支持的 Azure 服务之一或某个自定义终结点。
- 参考你在第一个步骤中创建的主题设置路由配置。
备注
禁用命名空间的公用网络访问将导致 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 门户中转到你的命名空间。
- 在“路由”下,选中“启用路由”。
- 在主题类型下,选择“命名空间主题”或“自定义主题”
- 在“主题”下,选择已创建的且所有 MQTT 消息将路由到其中的主题。
- 对于自定义主题,该列表仅显示满足事件网格自定义主题对路由的要求的主题
- 如果选择了自定义主题,则将显示“用于发送的托管标识”部分。 为标识选择以下选项之一,该标识将用于传送 MQTT 消息到自定义主题时对 MQTT 代理进行身份验证:
- 无:在这种情况下,需要在自定义主题上将“事件网格数据发送方”角色分配给自己。
- 系统分配的标识:在这种情况下,需要在命名空间上启用系统分配的标识作为先决条件,并将“EventGrid 数据发送者”角色分配给自定义主题上系统分配标识。
- 用户分配的标识:在这种情况下,需要在命名空间上启用用户分配的标识作为先决条件,并将“EventGrid 数据发送者”角色分配给自定义主题上的所选标识。
- 如果选择了用户分配的标识,则会显示一个下拉列表来支持你选择所需的标识。
- 选择“应用”。
有关扩充配置的说明,请参阅门户配置扩充。
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 消息路由的行为。
错误 | 错误说明 | 行为 |
---|---|---|
TopicNotFoundError | 已删除配置为接收所有 MQTT 路由消息的自定义主题。 | 事件网格丢弃了要路由的 MQTT 消息。 |
AuthenticationError | 已删除配置为 MQTT 路由消息的目标的自定义主题的事件网格数据发送方角色。 | 事件网格丢弃了要路由的 MQTT 消息。 |
TooManyRequests | 每秒 MQTT 路由消息数超过自定义主题的发布限制。 | 事件网格重新尝试路由 MQTT 消息。 |
ServiceError | 因服务器操作原因发生意外服务器错误。 | 事件网格重新尝试路由 MQTT 消息。 |
重试期间,事件网格在 MQTT 消息路由中使用了指数退避重试策略。 事件网格会尽量按以下计划重试传送:
- 10 秒
- 30 秒
- 1 分钟
- 5 分钟
- 10 分钟
- 30 分钟
- 1 小时
- 3 小时
- 6 小时
- 每 12 小时一次
如果排队等待重新传送的路由 MQTT 消息成功传送,事件网格会尽力从重试队列中删除该消息,但仍可能会收到重复项。
使用以下文章详细了解路由: