

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

# 最佳化 Kinesis Data Streams 生產者
<a name="advanced-producers"></a>

您可以根據您看到的特定行為，進一步最佳化 Amazon Kinesis Data Streams 生產者。檢閱下列主題以識別解決方案。

**Topics**
+ [自訂 KPL 重試和速率限制行為](kinesis-producer-adv-retries-rate-limiting.md)
+ [將最佳實務套用至 KPL 彙總](kinesis-producer-adv-aggregation.md)

# 自訂 KPL 重試和速率限制行為
<a name="kinesis-producer-adv-retries-rate-limiting"></a>

當您使用 KPL 操作新增 Amazon Kinesis Producer Library (KPL) 使用者記錄時，系統會為記錄提供時間戳記，並新增至具有 `RecordMaxBufferedTime`組態參數所設定截止日期的緩衝區。 `addUserRecord()`此時間戳記/截止日期的組合設定了緩衝區優先順序。記錄將根據下列條件從緩衝區排清：
+ 緩衝區優先順序
+ 彙整組態
+ 收集組態

影響緩衝區行為的彙整和收集組態參數如下：
+ `AggregationMaxCount`
+ `AggregationMaxSize`
+ `CollectionMaxCount`
+ `CollectionMaxSize`

然後，清除的記錄會以 Amazon Kinesis Data Streams 記錄的形式，使用對 Kinesis Data Streams API 操作 `PutRecords` 的呼叫來傳送至 Kinesis 資料串流。`PutRecords` 操作向串流傳送的請求偶爾會完全失敗或局部失敗。失敗的記錄會自動加回到 KPL 緩衝區。將根據以下兩個值當中較小者設定新的截止日期：
+ 目前 `RecordMaxBufferedTime` 組態減半
+ 記錄的存留時間值

此策略使重試的 KPL 使用者記錄得以納入後續 Kinesis Data Streams API 呼叫中，既強制實施了 Kinesis Data Streams 記錄的存留時間值又能提高輸送量並降低複雜性。其間不涉及退避演算法，使得此策略成為相對積極的重試策略。因重試次數過多造成的垃圾郵件會受到速率限制的阻止，相關內容將於下一節談論。

## 速率限制
<a name="kinesis-producer-adv-retries-rate-limiting-rate-limit"></a>

KPL 包含速率限制功能，可限制從單一生產者傳送的每個碎片輸送量。速率限制是使用字符儲存貯體演算法搭配用於 Kinesis Data Streams 記錄和位元組的單獨儲存貯體進行實作。每次成功寫入 Kinesis 資料串流都會將一個字符 (或多個字符) 加入各儲存貯體，最多達到特定閾值。此閾值可供設定，但預設情況下設定的值將比實際碎片限額高出 50%，使得來自單一生產者的碎片能夠達到飽和。

您可降低此限制以減少因重試次數過多造成的垃圾郵件。然而，最佳實務是由每個生產者主動重試最大傳輸量，透過擴展串流容量並實作相應的分割區索引鍵策略來處理判定為過多的任何形成調節情況。

# 將最佳實務套用至 KPL 彙總
<a name="kinesis-producer-adv-aggregation"></a>

雖然產生的 Amazon Kinesis Data Streams 記錄序號方案保持不變， 彙總會導致彙總 Kinesis Data Streams 記錄中包含的 Amazon Kinesis Producer Library (KPL) 使用者記錄索引從 0 （零） 開始； 不過， 只要您不依賴序號來唯一識別您的 KPL 使用者記錄， 您的程式碼可以忽略這一點， 作為彙總 (KPL 使用者記錄的 Kinesis Data Streams 記錄） 和後續的取消彙總 (Kinesis Data Streams 記錄的 Kinesis Data Streams 記錄的 KPL 使用者記錄） 會自動為您處理此問題。無論您的消費者使用的是 KCL 或 AWS SDK，這都適用。若要使用此彙總功能，如果您的取用者是使用 AWS SDK 中提供的 API 進行寫入，則需要將 KPL 的 Java 部分提取到組建中。

若您打算使用序號做為 KPL 使用者記錄的唯一識別符，建議您使用 `Record` 和 `UserRecord` 所提供遵守合約的 `public int hashCode()` 及 `public boolean equals(Object obj)` 操作，對您的 KPL 使用者記錄進行比較。此外，如果想要檢查 KPL 使用者記錄的子序號，您可以將其轉換為 `UserRecord` 執行個體並擷取其子序號。

如需詳細資訊，請參閱[實作消費者取消彙總](kinesis-kpl-consumer-deaggregation.md)。