Dynamodb 流,更新最新的流 ARN

Dynamo DB streams, update the latest stream ARN

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

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));

我 运行 遇到的问题是 tables LatestStreamArn 不会自行更新并且每 24 小时过期一次,此时我的程序开始工作。我总是只使用 "LATEST" 分片迭代器类型,所以我不想保留所有更改的 24 小时记录,我只想能够使用分片迭代器来检测对 table 的更改高效地显示它们。

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

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

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

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

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

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

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

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

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