Dynamo DB流,更新最新的流ARN

asu*_*and 0 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));
Run Code Online (Sandbox Code Playgroud)

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

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

Ben*_*rtz 6

24小时后,latestStreamArn不会过期。通过CreateTable或UpdateTable API调用启用DynamoDB流时,将创建一个流。

如果禁用DynamoDB流,然后重新启用它,则lastStreamArn将会更改。

使用ShardIteratorType LATEST调用GetShardIterator会导致您丢失数据,因为无法保证最后的GetRecords响应包括该点之前的所有记录。

为了跟踪DynamoDB流中的更改,您需要在实践中做一些事情:

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

  2. 定期调用DescribeStream以获取分片列表。使用每个分片中的parentShardId指针,您可以构造一个分片谱系。如果要按顺序处理更改,则必须先完整处理分片,然后再处理其任何后代。

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

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