2016-06-14 103 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