Что должно быть сделано при превышении выделенной пропускной способности?
Я использую AWS SDK для Javascript (Node.js) для чтения данных из таблицы DynamoDB. Функция автоматического масштабирования делает большую работу в течение большей части времени, и потребляемые единицы считывающей емкости (RCU) действительно не работают большую часть дня. Тем не менее, есть запрограммированное задание, которое выполняется около полуночи, которое потребляет примерно в 10 раз больше выделенного RCU, и, так как автоматическое масштабирование занимает некоторое время для регулировки емкости, существует много ограниченных запросов на чтение. Кроме того, я подозреваю, что мои запросы не выполняются (хотя я не могу найти никаких исключений в моем журнале ошибок).
Чтобы справиться с этой ситуацией, я рассмотрел вопрос об увеличении выделенного RCU с помощью AWS API ( updateTable), но вычисление количества RCU, в котором нуждается мое приложение, может быть не простым.
Таким образом, мое второе предположение состояло в том, чтобы повторить неудачные запросы и просто подождать, пока автоматическое масштабирование увеличит выделенный RCU. Как указано в документах AWS и некоторых ответах о переполнении стека (в частности, об ProvisionedThroughputExceededException):
AWS SDK для Amazon DynamoDB автоматически повторяют запросы, получающие это исключение. Таким образом, ваш запрос в конечном итоге будет успешным, если только запрос не слишком велик или ваша очередь повторных попыток слишком велика для завершения.
Я читал похожие вопросы ( этот, этот и этот), но я все еще в замешательстве: возникает ли это исключение, если запрос слишком велик или очередь повторных попыток слишком велика для завершения (поэтому после автоматических повторных попыток) или на самом деле до повторных попыток?
Самое главное: это исключение, которое я должен ожидать в моем контексте? (чтобы я мог поймать его и повторить, пока автоматическое масштабирование не увеличит RCU?)
1 ответ
Да.
Каждый раз, когда ваше приложение отправляет запрос, превышающий ваши возможности, вы получаете сообщение ProvisionedThroughputExceededException от Dynamo. Однако ваш SDK обрабатывает это для вас и повторяет попытку. Время повтора динамо по умолчанию начинается с 50 мс, число повторов по умолчанию равно 10, а откат по умолчанию экспоненциальный.
Это означает, что вы получаете повторы по адресу:
- 50мс
- 100мс
- 200мс
- 400мс
- 800ms
- 1.6S
- 3.2s
- 6.4s
- 12.8s
- 25.6s
Если после 10-й повторной попытки ваш запрос все еще не выполнен, SDK передает ProvisionedThroughputExceededException обратно в ваше приложение, и вы можете обработать его так, как вам нравится.
Вы можете справиться с этим, увеличив пропускную способность, но другой вариант - изменить время повторения по умолчанию при создании соединения Dynamo. Например
new AWS.DynamoDB({maxRetries: 13, retryDelayOptions: {base: 200}});
Это будет означать, что вы повторите попытку 13 раз с начальной задержкой 200 мс. Это даст вашему запросу в общей сложности 819,2 с, а не 25,6 с.