AWS Kinesis 的写入吞吐量相当低,为 1000 次写入/秒和 1MB/写入-秒。Kinesis 如何执行此限制?如果我试图在一秒钟内进行 1500 次写入,那么额外的 500 次写入会被放入某种队列中还是会失败?
2 回答
看起来它只是失败并引发异常。
未成功处理的记录包括 ErrorCode 和 ErrorMessage 值。ErrorCode 反映错误的类型,可以是以下值之一:ProvisionedThroughputExceededException 或 InternalFailure。ErrorMessage 提供有关 ProvisionedThroughputExceededException 异常的更多详细信息,包括帐户 ID、流名称和被限制记录的分片 ID。有关部分成功响应的更多信息,请参阅 Amazon Kinesis Data Streams 开发人员指南中的使用 PutRecords 添加多个记录。
https://docs.aws.amazon.com/kinesis/latest/APIReference/API_PutRecords.html
限速是怎么做的
速率限制 KPL 包括一个速率限制功能,它限制从单个生产者发送的每个分片的吞吐量。速率限制是使用令牌桶算法实现的,该算法具有用于 Kinesis Data Streams 记录和字节的单独桶。对 Kinesis 数据流的每次成功写入都会向每个存储桶添加一个令牌(或多个令牌),直至达到某个阈值。此阈值是可配置的,但默认设置为比实际分片限制高 50%,以允许单个生产者的分片饱和。
您可以降低此限制以减少由于过度重试而导致的垃圾邮件。但是,对于每个生产者而言,最佳实践是积极重试以获得最大吞吐量,并通过扩展流的容量和实施适当的分区键策略来处理任何被确定为过度的节流。
https://docs.aws.amazon.com/streams/latest/dev/kinesis-producer-adv-retries-rate-limiting.html
这取决于您写入数据的方式。
如果您使用的是PutRecord,那么任何超过限制的请求都将失败,ProvisionedThroughputExceededException
您必须重试该请求。但是,由于单个请求的往返时间约为 20-30 毫秒,因此您需要有大量客户端才能受到限制。
PutRecords调用被限制的可能性要高得多,因为您可以在单个请求中发送多达 500 条记录。如果它受到限制,则限制可能会影响整个请求或请求中的单个记录(如果一个分片接受记录而另一个分片不接受,则可能会发生这种情况)。
为了解决这个问题,您需要检查响应中的Records
列表。PutRecords
该数组与Records
请求中的列表完全对应,但包含PutRecordsResultEntry
值。
如果一个条目有一个,SequenceNumber
那么你就可以了:该记录被写入一个分片。但是,如果它有,ErrorCode
那么您需要从请求中复制记录并重新发送(假设错误代码超出吞吐量;如果是内部错误,您也可以尝试重新发送,但这可能不起作用)。
您将需要循环调用,PutRecords
直到响应没有任何未发送的消息。
请注意,由于个别记录可能会被限制和重新发送,您无法保证记录出现在分片上的顺序(它们按照收到的顺序存储在分片中)。