Dynamo DB流,更新最新的流ARN

时间:2016-05-10 22:34:05

标签: amazon-dynamodb amazon-kinesis

我的应用程序读取dynamoDB流以查找对表的更改,我目前正在获取最新的流:

this.awsDB.describeTable({TableName: 'MatchDraft'}, function(err, data){
  if(err){
    console.log(err);
  } else {
    this.streamArn = data.Table.LatestStreamArn;
    console.log(data, this.streamArn);
    _readStream.apply(this);
  }
}.bind(this));

我遇到的问题是,表LatestStreamArn不会自行更新并且每24小时过期一次,此时我的程序开始工作。我总是只使用“最新”的分片迭代器类型,所以我不想保留所有更改的24小时记录,我只是希望能够使用分片迭代器有效地检测对表的更改并将它们显示为发生。

如何以最有效的方式根据需要自动创建新的LatestStreamArn?代码在用户Web浏览器中都是客户端,所以我不想打开UpdateTable API的权限,据我所知,这是更新流的唯一方法。

1 个答案:

答案 0 :(得分:6)

latestStreamArn在24小时后不会过期。通过CreateTable或UpdateTable API调用启用DynamoDB Streams时会创建流。

如果禁用DynamoDB流然后重新启用它,

latestStreamArn将会更改。

使用ShardIteratorType LATEST调用GetShardIterator可能会导致数据丢失,因为无法保证最后一个GetRecords响应包含到那时为止的所有记录。

为了跟踪DynamoDB Streams的变化,您需要在实践中做一些事情:

  1. 启用流 - 您只需在此之后调用DescribeTable一次以获取latestStreamArn(您的应用程序可以在启动时调用一次)。

  2. 定期调用DescribeStream获取分片列表。使用每个分片中的parentShardId指针,可以构建分片的谱系。如果要按顺序处理更改,则必须在处理任何后代之前完全处理分片。

  3. 开始处理分片时调用GetShardIterator一次。如果要处理所有事件,可以使用TRIM_HORIZON分片迭代器类型。否则,您可以通过处理最新的分片(沿袭的最新一代)并从最新的分片迭代器类型开始来初始化您的应用程序。但是,如果您想按顺序处理记录,则必须在TRIM_HORIZON初始化您处理的所有未来分片。

  4. 重复调用GetRecords以通过分片进行分页。每个GetRecords结果都包含nextShardIterator,用于下一页结果。您无需在任何时候处理特定分片时调用GetShardIterator,而只需调用一次以获得有效的分片迭代器 - 然后您可以继续调用GetRecords直到到达分片结尾(nextShardIterator是空)。