本文提供有关 IoT 中心 消息路由的常见问题和解决方法的监视和故障排除指南。
监视消息路由
建议监视 与消息路由和终结点相关的 IoT 中心指标 ,以便大致了解发送的消息。 还可以创建诊断设置,以便将
如果想要维护与任何路由上的查询不匹配的消息,我们还建议启用 回退路由 。 可以在 内置终结点 中保留这些消息,以便配置保留天数。
首要问题
以下是消息路由观察到的最常见问题。 若要开始故障排除,请选择问题以获取详细步骤。
来自我的设备的消息未按预期转发
若要解决此问题,请分析以下信息。
此终结点的路由指标
与 路由相关的所有 IoT 中心指标 都带有 路由前缀。 可以合并来自多个指标的信息,以确定问题的根本原因。 例如,使用指标 Routing Deliveries 来确定消息数量。这些消息是在与任何路由查询不匹配且已禁用回退路由时传递到终结点或被丢弃的。 检查 路由延迟 指标,观察消息传递的延迟是稳定还是增加。 不断增长的延迟可能表示特定终结点出现问题,我们建议检查 终结点的运行状况。 这些路由指标还具有维度,这些 维度 提供有关指标的详细信息,例如终结点类型、特定的终结点名称,以及未传递消息的原因。
关于任何操作问题的资源日志
观察 路由 资源日志 以获取有关路由和终结点 作 的详细信息,或识别错误和相关 错误代码 ,以便进一步了解问题。 例如,由于消息格式出现问题,日志中的作名称 RouteEvaluationError 指示无法评估路由。 使用为特定 操作名称 提供的提示来缓解此问题。 将事件记录为错误时,日志还提供有关评估失败的原因的详细信息。 例如,如果操作名称为 EndpointUnhealthy,则 错误代码为 403004,表示终结点空间不足。
终结点的运行状况
使用 REST API 获取终结点运行状况 来获取终结点的运行状况。 此 API 还提供有关上次成功发送到终结点的消息、 上次已知错误、上次已知错误时间和上次为此终结点尝试发送尝试的时间的信息。 使用针对特定 最后一个已知错误提供的可能的缓解措施。
我突然停止在内置终结点获取消息
若要解决此问题,请分析以下信息。
是否已创建新路由?
创建路由后,数据将停止流向内置终结点,除非专门为该终结点创建路由。 若要确保消息在添加新路由时继续流向内置终结点,请配置到 事件 终结点的路由。
回退路由是否已禁用?
回退路由将所有不符合任何现有路由的任何查询条件的消息发送到与事件中心兼容的内置事件中心(消息/事件)。 如果消息路由已启用,则可以启用回退路由功能。 如果没有路由到达内置终结点,并启用了备用路由,则只有那些在任何路由上的查询条件都不匹配的消息会被发送到内置终结点。 此外,如果删除了所有现有路由,则必须启用回退路由才能在内置终结点接收所有数据。
可以在 Azure 门户中使用 IoT 中心的消息路由边栏选项卡启用或禁用后备路由。 您还可以使用 Azure 资源管理器通过 FallbackRouteProperties 为回退路由配置自定义终结点。
IoT 中心路由终结点的最后已知错误
获取 REST API 中的终结点运行状况可提供终结点的运行状况状态和最后一个已知错误,以确定终结点不正常的原因。 下表列出了最常见的错误。
| 上一个已知错误 | 说明/发生时 | 可能的缓解操作 |
|---|---|---|
| Transient | 发生暂时性错误,IoT 中心将重试该作。 | 观察 路由资源日志。 |
| 内部错误 | 将消息传送到终结点时出错。 | 此错误是内部异常,请同时检查路由资源日志。 |
| 未经 授权 | IoT 中心无权将消息发送到指定的终结点。 | 验证终结点的连接字符串是否为最新。 如果发生更改,请考虑更新您的 IoT 中枢。 如果终结点使用托管标识,请检查 IoT 中心主体是否具有目标所需的权限。 |
| 扼杀 | 将消息写入终结点时,IoT 中心被限流。 | 查看受影响终结点的速率限制。 根据需要修改终结点的配置以纵向扩展。 |
| 超时 | 操作超时。 | 重试操作。 |
| 找不到 | 目标资源不存在。 | 确保目标资源存在。 |
| 找不到容器 | 存储容器不存在。 | 确保存储容器存在。 |
| 容器已禁用 | 存储容器已禁用。 | 确保启用存储容器。 |
| 消息大小超出限制 | 消息路由的消息大小限制为 256 Kb。 正在路由的消息大小超出了此限制。 | 使用更少的应用程序属性或更少的消息扩充来检查消息大小是否可以减少。 |
| 不支持分区和重复检测 | 服务总线可能未启用重复检测功能。 | 禁用服务总线的重复检测,或者考虑使用不带重复检测的实体。 |
| SessionfulEntityNotSupported | 服务总线可能未启用会话。 | 在服务总线上禁用会话,或考虑使用没有会话的实体。 |
| 没有匹配的消息订阅 | 没有用于将消息写入服务总线主题的订阅。 | 创建用于路由 IoT 中心消息的订阅。 |
| 端点在外部被禁用 | 终结点未处于活动状态,因此 IoT 中心可以向其发送消息。 | 启用终结点以将其恢复为活动状态。 |
| 设备最大队列深度超出 | 已达到服务总线大小限制。 | 请考虑从目标事件中心删除消息,以允许将新消息引入到事件中心。 |
路由资源日志
以下是 路由资源日志中记录的作名称和错误代码。
操作名称
| 操作名称 | 级别 | Description |
|---|---|---|
| 未定义的路由评估 | 信息 | 无法在所给条件下对消息进行评估。 例如,如果消息中缺少路由查询条件中的属性。 详细了解 路由查询语法。 |
| 路由评估错误 (RouteEvaluationError) | 错误 | 由于消息格式出现问题,评估消息时出错。 例如,如果未指定内容编码或内容类型在消息中无效,则会记录此错误。 必须在 系统属性中设置这些属性。 |
| 丢失消息 | 错误 | 消息已删除,未路由。 这可能是因为消息与任何路由查询不匹配,或者因为终结点失效,导致在多次重试后仍然无法传递消息。 建议使用 REST API 获取终结点运行状况来获取有关终结点的更多详细信息。 |
| 终端不健康 | 错误 | 终结点尚未接受来自 IoT 中心的消息,IoT 中心正在尝试重新发送消息。 建议通过 REST API 查看终结点运行状况来观察最后一个已知错误。 |
| EndpointDead | 错误 | 终结点已经一个多小时未接受来自 IoT 中心的消息。 建议通过 REST API 获取终结点运行状况来查看最后一个已知错误。 |
| EndpointHealthy | 信息 | 终结点正常运行,并从 IoT 中心接收消息。 此消息不会连续记录,但仅当终结点再次正常时才会记录。 此消息表示 IoT 中心无法将消息发送到终结点,但终结点现在正常。 |
| 孤立消息 | 信息 | 消息与任何路由不匹配。 |
| 无效消息 | 错误 | 由于与终结点不兼容,消息无效。 建议检查终结点的配置。 |
UndefinedRouteEvaluation、RouteEvaluationError 和 OrphanedMessage 的操作被限速,每个 IoT 中心每分钟最多记录一次。
常见错误代码
| 错误代码 | Description |
|---|---|
| 401002 | IoT 中心未经授权的访问 |
| 413001 | 消息太大 |
| 403004 | 设备的最大队列深度已超出 |
| 503008 | 接收连接被限速 |
| 500000 | 通用服务器错误 |
| 401 | 未经 授权 |
| 503 | 服务不可用 |
| 500001 | 服务器错误 |
| 400103 | 内容编码或内容类型无效 |
| 404001 | 找不到设备 |
后续步骤
如果需要更多帮助,可以联系 Azure 支持方面的 Azure 专家。 或者,也可以提出 Azure 支持事件。 请转到 Azure 支持站点提交请求。