

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 評估您的 DynamoDB Streams 使用情況
<a name="CostOptimization_StreamsUsage"></a>

本章節概述如何評估 DynamoDB Streams 使用量。某些用量模式對 DynamoDB 來說並非最理想的，且從效能和成本角度來看，這些模式仍有最佳化空間。

您有兩個原生串流整合，適用於串流和事件驅動使用案例：
+ [Amazon DynamoDB Streams](Streams.md) 
+ [Amazon Kinesis Data Streams](Streams.KCLAdapter.md) 

此頁面將著重於這些選項的成本最佳化策略。若您想了解如何在兩個選項間選擇，請參閱 [變更資料擷取的串流選項](streamsmain.md#streamsmain.choose)。

**Topics**
+ [最佳化 DynamoDB Streams 的成本](#CostOptimization_StreamsUsage_Options_DDBStreams)
+ [最佳化 Kinesis Data Streams 的成本](#CostOptimization_StreamsUsage_Options_KDS)
+ [兩種 Streams 使用量類型的成本最佳化策略](#CostOptimization_StreamsUsage_GuidanceForBoth)

## 最佳化 DynamoDB Streams 的成本
<a name="CostOptimization_StreamsUsage_Options_DDBStreams"></a>

如 DynamoDB Streams 的[定價頁面](https://aws.amazon.com/dynamodb/pricing/on-demand/)所述，無論資料表的輸送容量模式為何，DynamoDB 都會根據對資料表 DynamoDB 串流發出的讀取請求量計費。對 DynamoDB 串流發出的讀取請求，與對 DynamoDB 資料表發出的讀取請求不同。

串流中的每個讀取請求都採用 `GetRecords` API 呼叫形式，可在回應中傳回最多 1000 筆記錄或 1 MB 的記錄，以先到達者為準。[其他 DynamoDB 串流 API](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB_Streams.html) 不會收取任何費用，且 DynamoDB Streams 不會因閒置而收費。換句話說，若沒有對 DynamoDB 串流發出讀取請求，則在資料表上啟用 DynamoDB 串流將不會產生任何費用。

以下是 DynamoDB Streams 的部分取用者應用程式：
+ AWS Lambda function(s)
+ Amazon Kinesis Data Streams型應用程式
+ 使用 AWS SDK 建置的客戶消費者應用程式

以 AWS Lambda 為基礎的 DynamoDB Streams 取用者提出的讀取請求是免費的，而任何其他類型的取用者提出的呼叫則會收費。每個月，非 Lambda 取用者發出的前 2,500,000 個讀取要求也是免費。這適用於對每個 AWS 區域 AWS 帳戶中任何 DynamoDB 串流提出的所有讀取請求。

**監控您的 DynamoDB Streams 使用量**  
帳單主控台上的 DynamoDB Streams 費用會針對 AWS 帳戶中跨 AWS 區域的所有 DynamoDB Streams 分組在一起。目前不支援標記 DynamoDB Streams，因此無法使用成本分配標籤來識別 DynamoDB Streams 的精細成本。您可以在 DynamoDB 串流層級取得 `GetRecords` 磁碟區，以計算每個串流的費用。磁碟區由 DynamoDB 串流的 CloudWatch 指標 `SuccessfulRequestLatency` 及其 `SampleCount` 統計資料表示。此指標也將包含由全域資料表進行的`GetRecords`呼叫，以執行持續複寫，以及由 AWS Lambda 消費者進行的呼叫，這兩者都不會收費。如需詳細了解 DynamoDB Streams 發布的其他 CloudWatch 指標，請參閱 [DynamoDB 指標和維度](metrics-dimensions.md)。

**使用 AWS Lambda 做為消費者**  
評估使用 AWS Lambda 函數做為 DynamoDB Streams 的取用者是否可行，因為這可以消除從 DynamoDB Stream 讀取相關的成本。另一方面，DynamoDB Streams Kinesis 轉接器或以 SDK 為基礎的取用者應用程式將根據他們對 DynamoDB 串流發出的 `GetRecords` 呼叫量計費。

Lambda 函式調用將根據標準 Lambda 定價收費，但 DynamoDB Streams 不會產生任何費用。Lambda 會輪詢您 DynamoDB 串流中的碎片，其記錄的基本速率為每秒 4 次。當記錄可用時，Lambda 會調用您的函數，並等待結果。如果處理成功，Lambda 會恢復輪詢，直到收到多筆記錄。

**調校以 DynamoDB Streams Kinesis 轉接器為基礎的取用者應用程式**  
由於非 Lambda 取用者發出的讀取要求會針對 DynamoDB Streams 收費，因此需在近乎即時的要求與取用者應用程式須輪詢 DynamoDB 串流的次數間找出平衡。

使用以 DynamoDB Streams Kinesis 轉接器為基礎的應用程式輪詢 DynamoDB Streams 的頻率由設定的 `idleTimeBetweenReadsInMillis` 值決定。此參數決定取用者在處理碎片前應等待的時間 (以毫秒為單位)，以防先前對相同碎片進行的 `GetRecords` 呼叫未傳回任何記錄。此參數的預設值為 1000 ms。若不需要近乎即時的處理，則可以增加此參數，讓取用者應用程式在 DynamoDB Streams 呼叫上進行較少的 `GetRecords` 呼叫，並進行最佳化。

## 最佳化 Kinesis Data Streams 的成本
<a name="CostOptimization_StreamsUsage_Options_KDS"></a>

當 Kinesis 資料串流設定為目的地，為 DynamoDB 資料表提供變更資料擷取事件時，Kinesis 資料串流可能需單獨的大小管理，但這會影響整體成本。DynamoDB 會根據變更資料擷取單位 (CDU) 計費，其中每單位皆由最多 1 KB DynamoDB 項目大小所組成，該項目則為 DynamoDB 服務嘗試傳送至目的地 Kinesis 動資料串流的內容。

除了 DynamoDB 服務費用外，也會產生標準的 Kinesis 資料串流費用。如[定價頁面](https://aws.amazon.com/kinesis/data-streams/pricing/)所述，服務定價會根據容量模式 (佈建和隨需) 而不同，這些模式與 DynamoDB 資料表容量模式不同，且為使用者定義。在高階上，Kinesis Data Streams 會根據容量模式以及 DynamoDB 服務擷取到的串流資料，按小時計費。視 Kinesis 資料串流的使用者組態而定，可能產生額外費用，例如資料擷取 (針對隨需模式)、延長資料保留 (超過預設 24 小時)，以及強化廣發取用者擷取。

**監控 Kinesis Data Streams 使用量**  
DynamoDB 專用 Kinesis Data Streams 除了標準的 Kinesis 資料串流 CloudWatch 指標外，還會從 DynamoDB 發布指標。DynamoDB 服務的`Put`嘗試可能會因為 Kinesis Data Streams 容量不足而受到 Kinesis 服務調節，或者可能設定為 AWS KMS 加密靜態 Kinesis Data Stream 資料的相依元件。

若要深入了解 DynamoDB 服務針對 Kinesis 資料串流發布的 CloudWatch 指標，請參閱 [使用 Kinesis Data Streams 監控變更資料擷取](kds_using-shards-and-metrics.md#kds_using-shards-and-metrics.monitoring)。為避免因限流而產生額外的服務重試成本，請確定在佈建模式中，Kinesis 資料串流的大小適中。

**為 Kinesis Data Streams 選擇合適的容量模式**  
Kinesis Data Streams 有兩種容量模式受支援：佈建模式和隨需模式。
+ 如果涉及 Kinesis 資料串流的工作負載具有可預測或準確預測的應用程式流量 (流量一致或逐漸增加)，那麼 Kinesis Data Stream 的**佈建模式**就很適合，且更具成本效益
+ 若該工作負載是新工作負載，有無法預測的應用程式流量，或您不想管理容量，那麼 Kinesis Data Streams 的**隨需模式**就很適合，且更具成本效益

最佳化成本的最佳實務是評估與 Kinesis 資料串流相關聯的 DynamoDB 資料表是否具有可預測的流量模式，該模式可利用 Kinesis Data Streams 的佈建模式。若工作負載是新工作負載，您可以在最初幾週使用 Kinesis Data Streams 的隨需模式，檢視 CloudWatch 指標以了解流量模式，再根據工作負載的性質將相同的串流切換至佈建模式。在佈建模式中，可以遵循 Kinesis Data Streams 的碎片管理考量事項，估算碎片數量。

**使用 DynamoDB 專用 Kinesis Data Streams，評估您的取用者應用程式**  
由於 Kinesis Data Streams 不會對 DynamoDB Streams 等 `GetRecords` 呼叫數量計費，因此只要頻率低於 `GetRecords` 的限流限制，取用者應用程式就能盡量執行呼叫。針對 Kinesis Data Streams 的隨需模式，資料讀取按 GB 計費。針對 Kinesis Data Streams 的佈建模式，若資料保留時間少於 7 天，則不收取讀取費用。若 Lambda 函式為 Kinesis Data Streams 取用者，Lambda 會在 Kinesis 串流輪詢每個碎片，以每秒一次的基本速率記錄。

## 兩種 Streams 使用量類型的成本最佳化策略
<a name="CostOptimization_StreamsUsage_GuidanceForBoth"></a>

**AWS Lambda 消費者的事件篩選**  
Lambda 事件篩選可讓您根據篩選條件捨棄事件，使其無法在 Lambda 函式調用批次中使用。如此一來，便可最佳化 Lambda 成本，以在取用者函數邏輯中處理或捨棄不需要的串流記錄。若要深入了解如何設定事件篩選和寫入篩選條件，請參閱 [Lambda 事件篩選](https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html)。

**調校 AWS Lambda 取用者**  
您可以調校 Lambda 組態參數，進一步最佳化成本，例如提升 `BatchSize` 以在每次調用處理更多內容、啟用 `BisectBatchOnFunctionError` 以防止處理重複項目 (會產生額外成本)，以及設定 `MaximumRetryAttempts` 以防產生太多重試次數。根據預設，失敗的取用者 Lambda 調用會無限重試，直到記錄從串流到期，DynamoDB Streams 的期限約為 24 小時，針對 Kinesis Data Streams 則可設定為 24 小時至最長 1 年。可在《[Lambda AWS 開發人員指南](https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html#services-ddb-params)》找到其他 Lambda 設定選項，包含上述適用於 DynamoDB 串流取用者的選項。