

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

# 自定义 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%，这将允许单个创建器中的分片饱和。

您可降低此限制来减少因重试次数过多而造成的垃圾邮件。然而，最佳实践是每个创建器主动重试最大吞吐量，通过扩展流的容量并实施相应的分区键策略来处理已确定为过多的任何结果限制。