You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用AWS IoT JavaScript SDK推送通知重复,请求问题排查

排查AWS IoT推送重复通知的问题

咱们一步步拆解你遇到的重复推送问题,结合你的代码和AWS IoT的特性,可能的原因和排查方向如下:

1. 先确认Lambda是不是被重复触发了

Lambda函数本身有重试机制(比如异步调用超时、错误时会自动重试),或者你的触发源(比如API Gateway、SNS等)可能重复发送了触发事件,导致iotdata.publish被调用了多次。

  • 去CloudWatch日志里查Lambda的执行记录,看看每次你预期的“一次推送”对应的Lambda是不是跑了多遍,有没有多次打印console.log(data)的记录。如果是,那问题出在Lambda的触发环节,得调整触发源的配置或者Lambda的重试策略。

2. QoS 1的特性可能导致重复

你代码里设置了qos: 1,AWS IoT的QoS 1规则是至少一次送达——也就是说,如果订阅者客户端没有及时给IoT Core返回确认(ACK),IoT Core会重新发送这条消息,直到收到ACK为止。

  • 如果你的订阅者客户端处理消息速度慢、网络不稳定,或者客户端没有正确实现ACK逻辑,就会触发重发,导致重复收到消息。
  • 可以先临时把qos改成0试试,QoS 0是“最多一次”送达,不会重发,看看重复问题会不会消失(当然这只适合对消息送达可靠性要求不高的场景)。

3. AWS SDK的自动重试在搞鬼

默认情况下,AWS SDK for JavaScript会自动开启重试机制(指数退避),如果publish请求因为网络波动、IoT Core响应延迟等原因没得到及时响应,SDK会自动重试这个请求,导致同一消息被推送多次。

  • 你可以在初始化IotData客户端的时候关闭自动重试,试试能不能解决:
const iotdata = new AWS.IotData({
  endpoint: '1234332.iot.eu-west-2.amazonaws.com',
  maxRetries: 0 // 关闭SDK自动重试
});

4. 订阅者客户端的锅?

有时候重复接收不一定是推送端的问题,可能是订阅者那边的逻辑有问题:

  • 检查订阅者是不是每次连接都重新订阅了同一个主题,没有清理之前的订阅实例,导致多个订阅通道接收同一条消息。
  • 如果订阅者用了持久订阅(比如保留会话),客户端重启后可能会收到离线期间的消息重放,看起来像是重复推送。

5. 用IoT Core日志排查消息流转

你可以开启AWS IoT Core的CloudWatch日志,查看消息的整个流转过程:

  • 登录AWS控制台进入IoT Core,找到“设置”里的日志配置,开启消息日志,然后查看日志里的消息publish记录和送达记录,确认到底是推送了多次,还是只是订阅者收到了多次。

内容的提问来源于stack exchange,提问作者Supun Madushanka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:25:29