使用 DynamoDB 進行串流資料
在 AWS 上開發應用程式
Ricardo Sueiras
Principal Technologist
DynamoDB Streams 基礎
- 近乎即時回應資料庫變更。
- 建立於事件驅動模式。
- 每次新增、修改、刪除都會產生串流紀錄。
- 建立即時回應的應用,無需輪詢資料表。
- 預設停用:用
StreamSpecification 啟用。
- 每個串流都有自己的 ARN,與資料表 ARN 不同。
保留期間
- 串流紀錄保留 24 小時。
- 變更檢視類型需要重建串流。
Streams 與 DynamoDB 讀取容量單位
- 讀取串流不會消耗你的讀取容量單位(RCU)。
- 啟用串流不影響預先配置的輸送量。
串流紀錄
- 每筆串流紀錄都包含描述變更的中繼資料。
- 串流擷取三種事件類型:
- 檢視類型決定每筆紀錄包含哪些資料。
KEYS_ONLY:只有分割鍵與排序鍵。
NEW_IMAGE:變更後的完整項目。
OLD_IMAGE:變更前的完整項目。
NEW_AND_OLD_IMAGES:變更前後的項目。
- 稽核常用
NEW_AND_OLD_IMAGES。
- DynamoDB Global Tables 需要此設定。
- 串流會依分割鍵保留事件順序。
- Lambda 以批次處理紀錄。
- 每個成功批次後進行檢查點。
- 失敗的批次會重試。
- 直到成功或紀錄過期才停止重試。
- Lambda 是最常見的串流消費者。
- 採用以輪詢為基礎的事件來源對應。
- 從串流讀取紀錄。
- 以批次紀錄觸發你的函式。
架構模式
- 常見的端到端流程:
- 項目更新寫入 DynamoDB。
- 變更會產生一筆串流紀錄。
- 該紀錄觸發 Lambda 進行處理。
擴充(Scaling)
- 串流在內部會被切分為分片(shards)。
- 每個分片最多允許 2 個同時消費者。
- Lambda 併發度會隨分片數量擴展。
- 可用以下設定微調處理:
BatchSize:每次呼叫的最大紀錄數。
MaximumBatchingWindow:為湊批而等待的時間。
MaximumRetryAttempts:送往失敗目的地前的重試次數。
MaximumRecordAgeInSeconds:丟棄超過此年齡的紀錄。
ParallelizationFactor:每分片的並行處理(上限 10)。
篩選與翻滾視窗
- Lambda 支援篩選條件。
- 在呼叫函式前就丟棄不需要的紀錄。
- 可減少不必要的呼叫與成本。
- Lambda 支援翻滾視窗(tumbling windows)。
管理重複紀錄
- 串流會精確擷取每次變更一次。
- Lambda 以至少一次語義處理紀錄。
- 設計消費者需具備冪等性。
- 常見做法:儲存已處理的
eventID 或 SequenceNumber。
- 跳過你已處理過的紀錄。
- 二者在重試間保持不變。
- 可作為可靠的冪等鍵。
處理失敗
ReportBatchItemFailures 僅重試失敗的紀錄。
- 處理 Lambda 失敗可用:
BisectBatchOnFunctionError 分割失敗批次。
- 重試控制。
- 將耗盡重試次數的「毒批次」送至失敗目的地。
DynamoDB 與 Kinesis 的整合
- 資料表可直接將變更推送到 Kinesis Data Streams。
- 透過 Kinesis Data Streams for DynamoDB 功能。
- 為獨立並行能力,非串接。
- 事件不會經過 DynamoDB Streams。
- 可在同一資料表同時啟用兩者。
監控:常見問題
- 常見的營運問題:
- 熱分割區。
- 重試失敗。
- 重複處理。
- 節流與消費者延遲。
監控:CloudWatch 指標
- 需監控的關鍵 CloudWatch 指標:
- Lambda Errors:顯示程式碼或下游問題。
- IteratorAge:數值過高代表消費者過慢。
- 節流指標:讀取超過限制。
- 批次處理失敗:紀錄送往 DLQ。
安全性
- 串流的存取由 IAM 權限控制。
- 串流會繼承資料表的加密設定。
- 對消費者與下游處理器套用最小權限原則。
Preparing Video For Download...