自定义KPL重试和速率限制行为 - Amazon Kinesis Data Streams

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

自定义KPL重试和速率限制行为

使用KPLaddUserRecord()操作添加 Kinesis Producer Library (KPL) 用户记录时,系统会给出一条记录一个时间戳并将其添加到缓冲区,其截止日期由RecordMaxBufferedTime配置参数设置。此时间戳/截止日期组合将设置缓冲区优先级。记录基于以下标准从缓冲区进行刷新:

  • 缓冲区优先级

  • 聚合配置

  • 集合配置

影响缓冲区行为的聚合和集合配置参数如下所示:

  • AggregationMaxCount

  • AggregationMaxSize

  • CollectionMaxCount

  • CollectionMaxSize

然后,通过调用 Kinesis Data Streams 操作,刷新的记录将作为 Amazon Kinesis Data Streams 记录发送到你的 Kinesis 数据流。API PutRecordsPutRecords 操作将请求发送到有时完全失败或部分失败的流。失败的记录会自动添加回KPL缓冲区。基于这两个值中的较小值设置新的截止日期:

  • 将当前 RecordMaxBufferedTime 配置分为两半

  • 记录的 time-to-live 价值

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

速率限制

KPL包括速率限制功能,该功能限制了从单个创建器发送的每个分片的吞吐量。使用令牌桶算法以及同时适用于 Kinesis Data Streams 记录和字节的单独存储桶来实施速率限制。每当对 Kinesis 数据流进行成功写入时都会将一个令牌(或多个令牌)添加到每个存储桶,直至达到特定阈值。此阈值是可配置的,但默认情况下设定的值将比实际分片限制高出 50%,这将允许单个创建器中的分片饱和。

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