设备收到一条状态变化消息,并不意味着它就是云端最近产生的那一条。如果只按接收时刻依次覆盖本地状态,较晚送达的旧消息可能把刚处理的新状态又改回去。

AWS IoT Device Shadow文档明确说明,服务消息不保证以特定顺序到达设备。对于文档所述的累积影子状态消息,设备可以依据正在跟踪的版本号,丢弃版本更旧的消息。[1] 这里的version是判断影子状态先后的依据,不能简单用网络接收次序代替。

在讨论处理逻辑之前,先把三个字段说清楚:desired记录应用期望的设备属性状态,reported记录设备报告的状态,delta表示两者之间的差异。AWS建议设备用reported沟通状态,应用及其他云服务用desired表达状态变化请求。[1] 把期望值写入影子,并不等于设备已经完成相应动作。

开发文档或联调记录中,可以同时保留消息对应的设备、影子名称、版本号,以及本次处理决定。若一条消息被判为过时,说明比较的是哪一份影子状态,便于追查原因。本文提出的是记录思路,不是AWS要求的统一日志格式,也没有在真实设备上执行状态变更。

多影子场景更需要保持范围清楚。AWS说明,各影子数据与其他影子及设备的其他属性相互独立;支持多个影子的设备,需要自行维护其所报告数据的一致性。[1] 因此,不宜拿一个影子的版本去替另一个影子判断新旧,也不能因为一条业务MQTT消息更新了,就推断影子中相关数据必然同步。

这类排查的重点,是区分收到消息、接受较新状态、执行动作和报告结果几个环节。本文仅解释官方描述的影子状态机制,不把它推广为所有消息队列都能丢弃旧事件的通用规则;涉及累计计数、独立事件或其他业务语义时,应按实际数据模型另行设计和测试。

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。