2016-05-10 24 views
0

我的應用程序讀取dynamoDB流以查找更改一個表,我目前得到的最新數據流是這樣的:迪納摩DB流,更新最新的流ARN

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按照最有效的方式進行需要?代碼是用戶網頁瀏覽器中的所有客戶端,所以我不想打開UpdateTable API的權限,據我所知是更新流的唯一方法。

+0

爲什麼你不使用AWS Lambda? –

+0

@EyalCh我想是因爲除了這個問題似乎應該是微不足道的,我不需要它。 lambda有多特別有用?現在看來,我只需要一個每24小時調用一次更新表的時鐘工作,並且沒有其他解決方案。拉姆達有更清晰的方法來解決這個問題嗎?你會用什麼具體做什麼? – asutherland

+0

@Eyal Ch如果lambda會幫助我肯定會喜歡知道如何。即使允許一個UpdateTable調用,我的流在一段時間後似乎不再活動。我可以使我的應用程序恢復工作的唯一方法是通過updateTable禁用流並重新啓用它:/ – asutherland

回答

2

latestStreamArn 24小時後不會過期。當您通過CreateTable或UpdateTable API調用啓用DynamoDB Streams時,會創建一個流。

如果您禁用DynamoDB流並重新啓用它,latestStreamArn將會更改。

使用ShardIteratorType LATEST調用GetShardIterator最後可能會導致數據丟失,因爲不能保證最後的GetRecords響應包含所有記錄直到該點。

爲了追蹤DynamoDB流,你需要做的幾件事情在實踐中的變化:

  1. 允許流 - 你只需要調用DescribeTable後,這個曾經獲得latestStreamArn(您的應用程序可以在啓動時調用一次)。

  2. 定期調用DescribeStream獲取分片列表。在每個分片中使用parentShardId指針,可以構建分片的譜系。如果要按順序處理更改,則必須在處理其任何後代之前全面處理分片。

  3. 開始處理分片時調用GetShardIterator一次。如果要處理所有事件,則可以使用TRIM_HORIZON分片迭代器類型。否則,您可以通過處理最新的分片(譜系中的最新一代)並從最新的分片迭代器類型開始來初始化您的應用程序。但是,如果要按順序處理記錄,則您所處理的所有未來碎片必須在TRIM_HORIZON處初始化。

  4. 重複調用GetRecords以通過分片進行分頁。每個GetRecords結果都包含下一頁結果的nextShardIterator。您不需要隨時調用GetShardIterator來處理特定的分片,只需要調用一次即可獲得有效的分片迭代器 - 然後您可以繼續調用GetRecords直到達到分片的末尾(nextShardIterator爲null) 。