2016-06-14 100 views
0

我想使用DynamoDB Streams在S3上进行增量DynamoDB备份。我有一个lambda读取dynamodb流并将文件写入S3。为了标记已经读取的碎片,我将ExclusiveStartShardId登录到配置文件中。阅读AWS Dynamodb流

我要做的就是:

  1. 描述流(使用登录ExclusiveStartShardId)
  2. 获取流的碎片
  3. 对于那些CLOSED(具有EndingSequenceNumber)我做了以下的所有碎片:
    • 获取特定分片的分片迭代器(shardIteratorType:'TRIM_HORIZON')
    • 迭代通过碎片和提取记录直到NextShardIterator成为空

这里的问题是,我只读封闭的碎片,为了获得新的记录,我必须等待(未定量电流的时间)它将被关闭。

看来,最后的碎片通常是OPEN状态(有NO EndingSequenceNumber)。如果我从上面的伪代码中删除对EndingSequenceNumber的检查,那么最终会出现无限循环,因为当我点击最后一个分片时,总是显示NextShardIterator。如果提取的项目为0,我也无法检查,因为碎片中可能存在“间隙”。

在本教程中numChanges为了阻止无限循环http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.LowLevel.Walkthrough.html#Streams.LowLevel.Walkthrough.Step5

什么是在这种情况下,最好的办法是使用?

我还发现了类似的问题:Reading data from dynamodb streams。不幸的是我找不到我的问题的答案。

+2

您是否将DynamoDB流设置为Lambda函数的事件源?从您的描述中,它几乎听起来像您正在尝试自己进行流式轮询。 – garnaat

+0

我的lambda的事件源是Scheduled Event:hourevent(它每小时执行一次)。当lambda执行时,我试图从某个“检查点”读取流并备份新数据。 – bpavlov

回答

1

为什么不将DynamoDB流附加为Lambda函数的事件源?然后,Lambda会负责轮询流并在必要时调用您的功能。详细信息请参见this

+0

但是这样Lambda函数将在DynamoDB中的每个数据修改上执行。这意味着我应该创建很多备份文件,即使批量大或者我应该读取,然后在s3上写入文件,这是昂贵且耗时的操作。 – bpavlov

+1

您可以控制批量大小最大为10000.因此,您的Lambda函数不一定会针对每个修改调用。 – garnaat

+0

但据我所知每个修改/插入都会调用lambda,并且在同时发生两个或多个修改时使用批量大小。换句话说,如果您在10秒内修改/插入并且批量大小为100的lambda函数将在10秒内执行(忽略批量大小)。 – bpavlov