【问题标题】:AWS DynamoDB not inserting all items from IoT Core with Rules engineAWS DynamoDB 未使用规则引擎从 IoT Core 插入所有项目
【发布时间】:2022-07-05 13:38:57
【问题描述】:

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

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

可能出错的地方:

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

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

不知何故,DynamoDB 不会插入所有被规则拦截的消息,即使 Cloudwatch 确认所有“RuleExecution”事件均成功。 Cloudwatch 也不显示任何失败的事件。

这可能是什么原因?

【问题讨论】:

  • 您如何确定并非所有项目都进入了 DynamoDB?是否有可能多个项目具有相同的键(因此一个会覆盖前一个项目)?
  • @jarmod 创建解决方案时,这完全超出了我的想象。这听起来很可能是一个原因,因为用于每个表条目的主键是 unix 时间戳。每秒有 100 个排队的条目,有些可能最终拥有相同的密钥。由于 AWS IoT 规则中的 timestamp() 函数以毫秒为单位运行,因此一旦每秒插入次数增加,可能会有一些覆盖。但是,当每秒有 100 条消息发布到主题流时,覆盖率 30% 似乎不太可能。虽然我很欣赏这个想法。
  • 您可以在代码中或通过 CloudTrail 显式计算放入 DynamoDB 的次数,然后与表中的项目数进行比较。这将迅速提醒您重复键。或者您可以修改您的 put 以使其以不存在该键的项目为条件,方法是使用 condition 并引发可见错误。
  • 虽然,由于消息来自同时运行所有线程的 JMeter 脚本,并且每个线程都有 1 秒的延迟来发帖,这意味着所有线程都尝试同时发帖时间,这可能是原因。
  • 如果可行,您可以在密钥上附加一个短 UUID 后缀。

标签: amazon-web-services amazon-dynamodb amazon-cloudwatch rules aws-iot-core


【解决方案1】:

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

要明确:用于将消息插入到 DynamoDB 的规则(IAM 角色被裁剪):

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 2018-04-26
    • 2019-05-03
    • 1970-01-01
    • 2017-04-05
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多