你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文提供有关 IoT 中心 消息路由的常见问题和解决方法的监视和故障排除指南。
监视消息路由
建议监视与消息路由和终结点相关的 IoT 中心指标,以便对发送的消息有个大致了解。 还可以创建诊断设置,将 IoT 中心资源日志中的路由作发送到 Azure Monitor 日志、事件中心或 Azure 存储进行自定义处理。 要了解有关使用指标、资源日志和诊断设置的更多信息,请参阅 监控 IoT 中心。 有关教程,请参阅 通过 IoT 中心设置和使用指标和资源日志。
如果要维护与任何路由上的查询不匹配的消息,建议同时启用回退路由。 可以按照配置的保留天数,在内置终结点中保留这些消息。
常见问题
以下是观察到的最常见的消息路由问题。 要开始故障排除,请选择问题以获取详细步骤。
设备上的消息未按预期方式路由
要解决此问题,请分析以下信息。
此终结点的路由指标
所有与路由相关的 IoT 中心指标都以“Routing”作为前缀。 你可以组合来自多项指标的信息来确定问题的根本原因。 例如,使用指标“路由传递数”来确定当消息与任何路由上的查询不匹配并且已禁用回退路由时传递到终结点或已删除的消息数。 检查“路由延迟”指标来观察消息传递的延迟是否稳定或增加。 延迟的增加可能表示特定终结点有问题,建议检查终结点的运行状况。 这些路由指标还具有维度,这些 维度 提供有关指标的详细信息,例如终端节点类型、特定终端节点名称以及未传送消息的原因。
任何操作问题的资源日志
观察 Routes 资源日志 以获取有关路由和终端节点 作 的更多信息,或识别错误和相关 错误代码 以进一步了解问题。 例如,日志中的操作名称 RouteEvaluationError 表示由于消息格式问题而无法评估路由。 使用为特定的操作名称提供的提示来缓解此问题。 将事件记录为错误时,日志还提供有关评估失败原因的详细信息。 例如,如果作名称为 EndpointUnhealthy,则 错误代码 为 403004 表示终端节点空间不足。
终结点的运行状况
使用 REST API 获取终端节点运行状况 获取终端节点的运行状况。 此 API 还提供有关上次成功将消息发送到终端节点的时间、 上次已知错误、上次已知错误时间以及上次尝试对此终端节点进行发送尝试的信息。 使用为特定的 最后一个已知错误提供的可能缓解措施。
从内置终结点处获取消息的过程突然停止
要解决此问题,请分析以下信息。
是否创建了新的路由?
在创建一个路由后,数据将停止流向内置终结点,除非创建了到该终结点的路由。 要确保在添加新路由时消息继续流向内置终端节点,请配置到 事件 终端节点的路由。
Fallback 路由是否被禁用?
回退路由将任何现有路由上不满足任何查询条件的所有消息发送到与事件中心兼容的内置事件中心(消息/事件)。 如果已启用消息路由,则可以启用此回退路由功能。 如果没有到内置终结点的路由并且已启用回退路由,则仅与路由上的任何查询条件不匹配的消息将被发送到内置终结点。 此外,如果已删除所有现有路由,则必须启用回退路由,才能接收内置终结点处的所有数据。
可在 Azure 门户中使用 IoT 中心的“消息路由”边栏选项卡启用或禁用回退路由。 还可以将 Azure 资源管理器用于 FallbackRouteProperties,以将自定义终结点用于回退路由。
上一个有个 IoT 中心路由终结点的已知错误
REST API 中的 Get Endpoint Health (获取终端节点运行状况) 提供终端节点的运行状况和最后一个已知错误,以确定终端节点运行状况不佳的原因。 下表列出了最常见的错误。
上次已知错误 | 描述/发生时间 | 可能的缓解操作 |
---|---|---|
暂时性 | 发生暂时性错误,IoT 中心将重试该作。 | 观察 routes 资源日志。 |
内部错误 | 将消息传送到终端节点时出错。 | 此错误是内部异常,但也要观察 路由资源日志。 |
未经 授权 | IoT 中心无权将消息发送到指定的终结点。 | 验证终端节点的连接字符串是否是最新的。 如果更改,请考虑在 IoT 中心进行更新。 如果终结点使用托管标识,请检查 IoT 中心主体是否对目标具有所需的权限。 |
扼杀 | 将消息写入终端节点时,IoT 中心受到限制。 | 查看受影响终端节点的限制。 根据需要修改终端节点的配置以纵向扩展。 |
超时 | 操作超时。 | 重试操作。 |
找不到 | Target 资源不存在。 | 确保目标资源存在。 |
未找到容器 | 存储容器 不存在。 | 确保存储容器存在。 |
容器已禁用 | Storage container 已禁用。 | 确保已启用存储容器。 |
MaxMessageSizeExceeded | 消息路由的消息大小限制为 256 Kb。 路由的邮件大小超出了此限制。 | 检查是否可以通过使用较少的应用程序属性或较少的消息扩充来减小消息大小。 |
PartitioningAndDuplicateDetectionNotSupported | 服务总线可能未启用重复检测。 | 从服务总线禁用重复检测,或考虑使用没有重复检测的实体。 |
SessionfulEntityNotSupported | 服务总线可能未启用会话。 | 从服务总线禁用会话,或考虑使用没有会话的实体。 |
NoMatchingSubscriptionsForMessage | 没有订阅来写入服务总线主题上的消息。 | 为要路由到的 IoT 中心消息创建订阅。 |
端点外部已禁用 | Endpoint 未处于活动状态,因此 IoT Hub 可以向其发送消息。 | 启用终端节点以将其恢复为活动状态。 |
设备最大队列深度超出 | 已达到服务总线大小限制。 | 请考虑从目标事件中心删除消息,以允许将新消息引入事件中心。 |
路由资源日志
以下是 路由资源日志中记录的作名称和错误代码。
作名称
操作名称 | 级别 | DESCRIPTION |
---|---|---|
UndefinedRouteEvaluation | 信息 | 不能使用 giving 条件评估消息。 例如,如果消息中缺少路由查询条件中的属性。 了解有关 路由查询语法的更多信息。 |
RouteEvaluationError (路由评估错误) | 错误 | 由于消息格式存在问题,评估消息时出错。 例如,如果消息中未指定内容编码或内容类型无效,则会记录此错误。 这些必须在 系统属性中设置。 |
DroppedMessage | 错误 | 消息已删除且未路由。 这可能是由于以下原因:消息与任何路由查询都不匹配,或者终端节点已失效,并且在多次重试后无法传送消息。 我们建议使用 REST API 获取终端节点运行状况以获取有关终端节点的更多详细信息。 |
端点不正常 | 错误 | 终结点未接受来自 IoT 中心的消息,并且 IoT 中心正在尝试重新发送消息。 我们建议通过 REST API 获取终端节点运行状况来观察最后一个已知错误。 |
端点死亡 | 错误 | Endpoint 已超过一个小时未接受来自 IoT Hub 的消息。 我们建议通过 REST API 获取终端节点运行状况来观察最后一个已知错误。 |
终端节点运行状况 | 信息 | 终结点运行状况良好,并且正在从 IoT 中心接收消息。 此消息不会连续记录,而仅在终端节点再次恢复正常时记录。 此消息表示 IoT 中心无法向终端节点发送消息,但终端节点现在运行状况良好。 |
OrphanedMessage (孤立消息) | 信息 | 该消息与任何路由都不匹配。 |
无效消息 | 错误 | 由于与终端节点不兼容,消息无效。 我们建议检查终端节点的配置。 |
作 UndefinedRouteEvaluation、 RouteEvaluationError 和 OrphanedMessage 受到限制,并且每个 IoT 中心每分钟记录不超过一次。
常见错误代码
错误代码 | DESCRIPTION |
---|---|
401002 | IoT 中心未经授权的访问 |
413001 | 消息太大 |
403004 | 超出设备最大队列深度 |
503008 | 接收链路受限制 |
500000 | 通用服务器错误 |
401 | 未经 授权 |
503 | 服务不可用 |
500001 | 服务器错误 |
400103 | 无效的内容编码或内容类型 |
404001 | 未找到设备 |
后续步骤
如果需要更多帮助,可以通过 Microsoft Q&A 和 Stack Overflow 论坛联系 Azure 专家。 或者,也可以提出 Azure 支持事件。 请转到 Azure 支持站点并选择 获取支持。