

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 优化 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>

当您使用 KCL `addUserRecord()` 操作添加 Amazon Kinesis Producer Library（KPL）用户记录时，将利用由 `RecordMaxBufferedTime` 配置参数设置的截止日期为记录提供一个时间戳并将记录添加到缓冲区。此时间 stamp/deadline 组合设置缓冲区优先级。记录基于以下标准从缓冲区进行刷新：
+ 缓冲区优先级
+ 聚合配置
+ 集合配置

影响缓冲区行为的聚合和集合配置参数如下所示：
+ `AggregationMaxCount`
+ `AggregationMaxSize`
+ `CollectionMaxCount`
+ `CollectionMaxSize`

然后，通过调用 Kinesis Data Streams API 操作 `PutRecords`，刷新的记录将作为 Amazon Kinesis Data Streams 记录发送到您的 Kinesis 数据流。`PutRecords` 操作将请求发送到有时完全失败或部分失败的流。失败的记录将自动添加回 KPL 缓冲区。基于这两个值中的较小值设置新的截止日期：
+ 将当前 `RecordMaxBufferedTime` 配置分为两半
+ 记录的 time-to-live价值

此策略允许将重试的 KPL 用户记录包含在后续的 Kinesis Data Streams API 调用中，以提高吞吐量并降低复杂性，同时强制执行 Kinesis Data Streams 记录的值。 time-to-live不存在退避算法，这使得该策略成为相对积极的重试策略。由于重试次数过多而造成的垃圾邮件会受到速率限制的阻止，该内容将在下一部分中进行讨论。

## 速率限制
<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 记录的序列号架构保持相同时，聚合会形成包含在以 0（零）为开始的聚合 Kinesis Data Streams 记录的 Amazon Kinesis Producer Library（KPL）用户记录的索引；然而，只要您不依赖序列号来唯一标识您的 KPL 用户记录，您的代码可忽略它，因为聚合（属于您的 Kinesis Data Streams 记录中的 KPL 用户记录）和后续取消聚合（属于您的 KPL 用户记录中的 Kinesis Data Streams 记录）将自动为您考虑这一方面。无论您的消费者使用的是 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)。