Что должно быть сделано при превышении выделенной пропускной способности?

Я использую 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 с.

Другие вопросы по тегам