AWS IoT Core转DynamoDB数据丢失问题排查求助
AWS IoT Core转DynamoDB数据丢失/延迟问题排查与修复方案
1. 检查IoT Core规则的错误日志与重试策略
- 登录CloudWatch,找到IoT Core规则的执行日志组,查看是否有写入失败的记录(比如权限不足、数据格式错误、DynamoDB限流报错)。
- 默认情况下,IoT Core规则重试失败消息的次数有限,超出后会直接丢弃。建议配置错误操作,将失败消息转发到S3或SQS暂存,后续通过Lambda批量导入DynamoDB,避免数据丢失。
2. 验证DynamoDB表的吞吐量配置
- 查看CloudWatch中DynamoDB的
WriteCapacityUnits指标,如果写入请求持续超过表的预置吞吐量,会触发限流,导致延迟或写入失败。 - 开启自动扩缩容,或临时调高预置吞吐量(按需模式则检查是否突发写入超出服务限制),观察延迟问题是否缓解。
3. 核对IoT Core规则的SQL语句
- 确认SQL没有错误过滤数据:比如是否误加了
WHERE条件(如WHERE M_alarm = 1),导致正常状态的消息被拦截。 - 检查字段映射是否正确:确保DynamoDB表的主键字段存在于消息中,且SQL语句没有遗漏字段或拼写错误。
4. 确认消息路由的正确性
- 验证IoT Core规则的触发主题与传感器发布的主题完全匹配,通配符使用是否准确(比如
sensor/data/#是否覆盖所有子主题)。 - 用IoT Core测试客户端订阅传感器主题,确认消息确实以10-40秒的频率到达,排除传感器端的发送异常。
5. 匹配数据格式与DynamoDB字段类型
- 当前测试数据所有字段均为字符串类型,检查DynamoDB表的字段类型是否与之匹配:比如若表中
time字段设为日期类型,需在IoT Core规则中用函数转换格式(如SELECT parse_time(time, 'yyyy-MM-dd HH:mm:ss') AS time, * FROM 'topic')。 - 对数值型字符串,可通过
cast(字段名 AS DECIMAL)转换为数字类型,避免DynamoDB因类型不匹配拒绝写入。
6. 配置持久化兜底机制
- 为IoT Core规则添加错误处理动作,将写入失败的消息存入S3或SQS,后续编写Lambda函数定期读取这些消息并批量写入DynamoDB,确保极端情况下数据不丢失。
测试数据格式
{ "GEG_BUF2_LT01_M3": "477.4305", "GEG_BIO1_TT_01": "8.709491", "STATUS_BIO2_P_02": "0", "STATUS_BIO1_S_01": "0", "STATUS_BIO2_P_01": "0", "M_alarm": "0", "M_nieuw_alarm": "0", "time": "2022-12-04 20:48:01" }
内容的提问来源于stack exchange,提问作者Baggless
相关产品推荐
相关产品推荐

