【问题标题】:Reading data from dynamodb streams从 dynamodb 流中读取数据
【发布时间】:2015-08-27 07:52:48
【问题描述】:

我为我的发电机表设置了流。我正在按照文档中的示例程序从流中读取数据(http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.LowLevel.Walkthrough.CompleteProgram.html)。但是我有一个问题- 在遍历分片时,似乎检查分片迭代器是否为空并不是退出循环的充分条件。我的代码进入无限循环。在示例程序中,计算更改次数并用于退出循环-->

while (nextItr != null && numChanges > 0) {

   // Use the iterator to read the data records from the shard

  GetRecordsResult getRecordsResult = 
          streamsClient.getRecords(new GetRecordsRequest().
          withShardIterator(nextItr));
   List<Record> records = getRecordsResult.getRecords();
   System.out.println("Getting records...");
   for (Record record : records) {
           System.out.println(record);
            numChanges--;
    }
    nextItr = getRecordsResult.getNextShardIterator();
}

但在真实环境中,我确信维护更改列表是不切实际的。设计是否意味着无限循环?为什么 shardIterator 不会变成 null?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    我在这里重复你在AWS Forums 上发布的相同问题的答案:

    只要分片打开并且正在积极接收未来可能的更新,nextIterator 就不会变为 null。一旦分片关闭并遍历了最后一条记录,您的循环可能会退出并指示不再可能从分片中获取更多记录。

    请在此处参考我们的文档:http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/model/GetRecordsResult.html#getNextShardIterator()

    "如果设置为 null,则分片已关闭,请求的迭代器将不再返回任何数据。"

    希望对您有所帮助,感谢您对 DynamoDB 的关注!

    【讨论】:

    • 谢谢。但是在读取流时退出此循环的最佳方法是什么?我求助于检查记录数是否为 0,然后退出循环。但我想知道流之间是否有空碎片。
    • 即使在接收到 getRecords 结果为 0 之后,也肯定有更多记录的可能性。如果流仍然打开以进行写入,您如何确定没有更多记录可以进入您的活动流?您确定的唯一方法是禁用流,以便您确定没有更多记录可以进入,然后遍历记录直到 nextIterator 为空。否则,开放流的意义在于您应该始终轮询更多记录,因为只要流打开,记录就可能再次出现。
    • 那么有什么方法可以关闭分片 X,创建一个新的 Y(以便在 DynamoDB 中存储新的可能更改)并从分片 X 读取直到某个时期的所有更改?
    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2016-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2019-09-10
    相关资源
    最近更新 更多