AWS DynamoDB 不使用规则引擎从 IoT Core 插入所有项目

AWS DynamoDB not inserting all items from IoT Core with Rules engine

所以我使用 AWS IoT Core、AWS 规则引擎和 AWS DynamoDB 创建的 IoT 解决方案存在问题。

解决方案如下所示:MQTT 消息发布到主题“topic/+/data”,其中 “+”是发布消息的东西。有一条规则拦截这些消息 并且应该将发布的消息作为记录保存在 DynamoDB table 中。问题是 并非所有消息都保存在数据库中。 DynamoDB tables 容量模式设置为“按需”。

可能出错的地方:

  1. 并非所有消息都发布到主题流
  2. 该规则未捕获所有消息
  3. DynamoDB 没有按应有的方式保留所有消息

1 和 2 可以删除,因为 AWS Cloudwatch IoT 日志仅显示成功的“RuleExecution”事件,这些事件与发布的消息量相对应,即如果发布了 600 条消息 然后有 600 个成功的“RuleExecution”事件。这也针对发布的 500 条消息进行了测试。这些消息源自 Apache JMeter 的负载测试,其中不同数量的设备每秒模拟 post 条消息。设备数量 运行 从 10 增加到 100,并且 运行 在 30 秒和 15 分钟之间。所有测试的结果占很大比例,高达 30%, 未插入 DynamoDB 的消息 table 即使 Cloudwatch 声称它们已成功插入。

DynamoDB 以某种方式没有插入规则拦截的所有消息,即使 Cloudwatch 确认所有“RuleExecution”事件均已成功。 Cloudwatch 也不显示任何失败事件。

这可能是什么原因?

问题是主键冲突。通过使用 timestamp() 作为主键和 traceid() 作为排序键,一切都按预期进行。我现在可以在 table 中看到多个条目具有相同的时间戳。

要清楚:用于将消息插入 DynamoDB 的规则(IAM 角色被裁剪掉):