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