Как AWS Kinesis дроссельной записи записывает пропускную способность?
AWS Kinesis имеет довольно низкую пропускную способность записи - 1000 записей в секунду и 1 МБ / записи в секунду. Как Kinesis обеспечивает соблюдение этого ограничения? Если бы я попытался сделать 1500 записей в секунду, дополнительные 500 записей были бы помещены в какую-то очередь или они просто потерпели бы неудачу?
2 ответа
Похоже, что он просто терпит неудачу и выдает исключение.
Неудачно обработанная запись включает значения ErrorCode и ErrorMessage. ErrorCode отражает тип ошибки и может принимать одно из следующих значений: ProvisionedThroughputExceededException или InternalFailure. ErrorMessage предоставляет более подробную информацию об исключении ProvisionedThroughputExceededException, включая идентификатор учетной записи, имя потока и идентификатор сегмента для записи, которая была отрегулирована. Для получения дополнительной информации о частично успешных ответах см. Добавление нескольких записей с помощью PutRecords в Руководстве разработчика по Amazon Kinesis Data Streams.
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
Это зависит от того, как вы пишете данные.
Если вы используете PutRecord, любой запрос, превышающий лимит, завершится с ошибкой ProvisionedThroughputExceededException
и вам придется повторить запрос. Однако, поскольку время приема-передачи для одного запроса составляет порядка 20-30 мс, вам нужно иметь большое количество клиентов для регулирования.
Вызов PutRecords имеет гораздо более высокую вероятность того, что он будет ограничен, поскольку вы можете отправить до 500 записей за один запрос. И если это регулируется, регулирование может повлиять на весь запрос или отдельные записи в запросе (это может произойти, если один шард принимает записи, а другой - нет).
Чтобы справиться с этим, вам нужно изучить Records
список из PutRecords
ответ. Этот массив точно соответствует Records
список из запроса, но содержит PutRecordsResultEntry
ценности.
Если запись имеет SequenceNumber
тогда вы в порядке: эта запись была записана в осколок. Если, однако, он имеет ErrorCode
затем вам нужно скопировать запись из запроса и повторно отправить ее (при условии, что код ошибки превышен пропускной способностью; вы также можете попробовать повторно отправить, если это внутренняя ошибка, но это может не сработать).
Вам нужно будет зацикливаться, вызывая PutRecords
пока в ответе не появятся неотправленные сообщения.
Помните, что из-за возможности регулирования и повторного отправки отдельных записей вы не можете гарантировать порядок появления записей в сегменте (они хранятся в фрагменте в том порядке, в котором они были получены).