使用 DynamoDB 進行串流資料

在 AWS 上開發應用程式

Ricardo Sueiras

Principal Technologist

DynamoDB Streams 基礎

 

fundamentals

  • 近乎即時回應資料庫變更。
  • 建立於事件驅動模式。
  • 每次新增、修改、刪除都會產生串流紀錄。
  • 建立即時回應的應用,無需輪詢資料表。
  • 預設停用:用 StreamSpecification 啟用。
  • 每個串流都有自己的 ARN,與資料表 ARN 不同。
在 AWS 上開發應用程式

保留期間

 

retention

  • 串流紀錄保留 24 小時。
    • 保留期固定,無法調整。
  • 變更檢視類型需要重建串流。
    • 新串流會有新的串流 ARN。
在 AWS 上開發應用程式

Streams 與 DynamoDB 讀取容量單位

 

rcu

  • 讀取串流不會消耗你的讀取容量單位(RCU)。
  • 啟用串流不影響預先配置的輸送量。
在 AWS 上開發應用程式

串流紀錄

  • 每筆串流紀錄都包含描述變更的中繼資料。
  • 串流擷取三種事件類型:
    • INSERT
    • MODIFY
    • REMOVE

 

stream records

在 AWS 上開發應用程式
  • 檢視類型決定每筆紀錄包含哪些資料。
    • KEYS_ONLY:只有分割鍵與排序鍵。
    • NEW_IMAGE:變更後的完整項目。
    • OLD_IMAGE:變更前的完整項目。
    • NEW_AND_OLD_IMAGES:變更前後的項目。
  • 稽核常用 NEW_AND_OLD_IMAGES
  • DynamoDB Global Tables 需要此設定。

stream views

在 AWS 上開發應用程式
  • 串流會依分割鍵保留事件順序。
  • Lambda 以批次處理紀錄。
    • 每個成功批次後進行檢查點。
    • 失敗的批次會重試。
    • 直到成功或紀錄過期才停止重試。

 

ordering

在 AWS 上開發應用程式

 

streams and aws lambda

  • Lambda 是最常見的串流消費者。
  • 採用以輪詢為基礎的事件來源對應。
  • 從串流讀取紀錄。
  • 以批次紀錄觸發你的函式。
在 AWS 上開發應用程式

架構模式

 

arch patterns

  • 常見的端到端流程:
    • 項目更新寫入 DynamoDB。
    • 變更會產生一筆串流紀錄。
    • 該紀錄觸發 Lambda 進行處理。
在 AWS 上開發應用程式

擴充(Scaling)

 

scaling

  • 串流在內部會被切分為分片(shards)。
    • 類似 Kinesis Data Streams。
  • 每個分片最多允許 2 個同時消費者。
    • 超出上限常導致讀取節流。
在 AWS 上開發應用程式
  • Lambda 併發度會隨分片數量擴展。
  • 可用以下設定微調處理:
    • BatchSize:每次呼叫的最大紀錄數。
    • MaximumBatchingWindow:為湊批而等待的時間。
    • MaximumRetryAttempts:送往失敗目的地前的重試次數。
    • MaximumRecordAgeInSeconds:丟棄超過此年齡的紀錄。
    • ParallelizationFactor:每分片的並行處理(上限 10)。

scaling with lambda

在 AWS 上開發應用程式

篩選與翻滾視窗

  • Lambda 支援篩選條件。
    • 在呼叫函式前就丟棄不需要的紀錄。
    • 可減少不必要的呼叫與成本。
  • Lambda 支援翻滾視窗(tumbling windows)。
    • 在同一分片跨批次彙總狀態。

 

filtering and tumbling windows

在 AWS 上開發應用程式

管理重複紀錄

  • 串流會精確擷取每次變更一次。
  • Lambda 以至少一次語義處理紀錄。
    • 重試可能重複處理相同紀錄。
  • 設計消費者需具備冪等性。
  • 常見做法:儲存已處理的 eventIDSequenceNumber
    • 跳過你已處理過的紀錄。
    • 二者在重試間保持不變。
    • 可作為可靠的冪等鍵。

 

managing duplicate records

在 AWS 上開發應用程式

處理失敗

 

handling failures

  • ReportBatchItemFailures 僅重試失敗的紀錄。
  • 處理 Lambda 失敗可用:
    • BisectBatchOnFunctionError 分割失敗批次。
    • 重試控制。
    • 將耗盡重試次數的「毒批次」送至失敗目的地。
在 AWS 上開發應用程式

DynamoDB 與 Kinesis 的整合

 

integration

  • 資料表可直接將變更推送到 Kinesis Data Streams。
    • 透過 Kinesis Data Streams for DynamoDB 功能。
    • 為獨立並行能力,非串接。
    • 事件不會經過 DynamoDB Streams。
  • 可在同一資料表同時啟用兩者。
    • 兩者各自運作。
    • 可支援更廣的串流與分析架構。
在 AWS 上開發應用程式

監控:常見問題

 

troubleshooting

  • 常見的營運問題:
    • 熱分割區。
    • 重試失敗。
    • 重複處理。
    • 節流與消費者延遲。
在 AWS 上開發應用程式

監控:CloudWatch 指標

  • 需監控的關鍵 CloudWatch 指標:
    • Lambda Errors:顯示程式碼或下游問題。
    • IteratorAge:數值過高代表消費者過慢。
    • 節流指標:讀取超過限制。
    • 批次處理失敗:紀錄送往 DLQ。

 

troubleshooting

在 AWS 上開發應用程式

安全性

  • 串流的存取由 IAM 權限控制。
  • 串流會繼承資料表的加密設定。
    • 包含 KMS 的伺服器端靜態加密。
  • 對消費者與下游處理器套用最小權限原則。

 

security

在 AWS 上開發應用程式

一起來練習吧!

在 AWS 上開發應用程式

Preparing Video For Download...