

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 `addUserRecord()` オペレーションを使用して Amazon Kinesis Producer Library (KPL) ユーザーレコードを追加すると、レコードはタイムスタンプが付けられて、`RecordMaxBufferedTime` 設定パラメータで期限が設定されたバッファに追加されます。このタイムスタンプと期限の組み合わせにより、バッファの優先順位が設定されます。レコードは、次の条件に基づいてバッファからフラッシュされます。
+ バッファの優先度
+ 集約設定
+ 収集設定

バッファの動作に影響を与える集約および収集の設定パラメータは次のとおりです。
+ `AggregationMaxCount`
+ `AggregationMaxSize`
+ `CollectionMaxCount`
+ `CollectionMaxSize`

フラッシュされたレコードは、Kinesis Data Streams API オペレーション `PutRecords` の呼び出しを使用して Amazon Kinesis Data Streams レコードとして Kinesis Data Streams に送信されます。`PutRecords` オペレーションはストリームにリクエストを送信しますが、すべての失敗または部分的な失敗を示す場合があります。失敗したレコードは、自動的に KPL バッファに戻されます。新しい期限は、次の 2 つの値のうち小さい方に基づいて設定されます。
+ 現在の `RecordMaxBufferedTime` 設定の半分
+ レコードの有効期限値

この戦略では、再試行する KPL ユーザーレコードをそれ以降の Kinesis Data Streams API コールに含めることができ、Kinesis Data Streams レコードの有効期限値を適用しながら、スループットを改善し、複雑さを減らすことができます。バックオフアルゴリズムがないため、これは比較的積極的な再試行戦略です。過剰な再試行による大量送信は、次のセクションで説明するレート制限により防止できます。

## レート制限
<a name="kinesis-producer-adv-retries-rate-limiting-rate-limit"></a>

KPL にはレート制限機能があり、1 つのプロデューサーからの送信されるシャード単位のスループットを制限できます。レート制限は、Kinesis Data Streams のレコードとバイトに別々のバケットを使用するトークンバケットアルゴリズムを使用して実装されています。Kinesis Data Streams への書き込みが成功するたびに、特定のしきい値に達するまで、各バケットに 1 つまたは複数のトークンが追加されます。このしきい値は設定できますが、デフォルトでは実際のシャード制限より 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 レコードの KPL ユーザーレコードへの集約解除) で自動的に考慮されるため、このようにインデックス作成が 0 (ゼロ) から始まることをコード上は無視してかまいません。これは、コンシューマーが 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)を参照してください。