Исправление исключения регулирования AWS с использованием экспоненциального отката

Регулирование исключений в AWS и способы их устранения

Внедрение экспоненциального отката для сервисов AWS с помощью boto3

Примечание. Для тех, кто не является участником, эта статья также доступна по адресу https://dineshkumarkb.com/tech/throttling-exceptions-in-aws-and-ways-to-resolve-them/.

В различных ситуациях нам может потребоваться повторно обращаться к любому сервису AWS, скажем, к SageMaker через boto3 SDK. Например, вам может потребоваться получить количество доступных ноутбуков Jupyter каждые 20 секунд.

Вот как вы можете создать исключение регулирования:

import boto3
client = boto3.client('sagemaker',region_name = UR_REGION)
for i in range(200):
    print(" The retry number is {} ".format(i))
    response = client.list_notebook_instances()
    print(response)
Output:
 The retry number is 0 
{'NotebookInstances': [{'NotebookInstanceName': 'dfdasf'... }
 The retry number is 1 
{'NotebookInstances': [{'NotebookInstanceName': 'dfdasf'...}
 The retry number is 2 
{'NotebookInstances': [{'NotebookInstanceName': 'dfdasf'...}
.
.
.

В первый раз исключение регулирования возникает примерно между 50 и 70 повторными попытками, и количество повторных попыток постепенно уменьшается при последовательных выполнениях, что, в свою очередь, снова увеличивает количество запросов.

Вызовы API к любому сервису AWS не могут превышать максимально допустимую частоту запросов API для каждого аккаунта и региона AWS. Неважно, откуда поступают вызовы: из приложения, из интерфейса командной строки AWS (AWS CLI) или из консоли управления AWS. Если запросы API превышают максимальную скорость, вы получаете сообщение об ошибке «Превышение скорости», после чего вызовы API регулируются.

Это не только останавливает операции через API, но и временно останавливает любую операцию с этим конкретным сервисом AWS.

Чтобы решить эту проблему, нам может потребоваться сделать следующее

  1. Уменьшите скорость обращения API к сервису AWS.
  2. Реализовать экспоненциальный откат

Каждый AWS SDK реализует логику автоматического повтора и алгоритмы экспоненциальной отсрочки.

import boto3
from botocore.config import Config
# the default max_attempts is set to 4
config = Config(retries=dict(max_attempts=10))
client = boto3.client('sagemaker', config=config)
for i in range(200):
    print(" The retry number is {} ".format(i))
    response = client.list_notebook_instances()
    print(response)

После увеличения максимального количества попыток до 10 (это может быть значение по вашему выбору в зависимости от количества повторных попыток) исключение регулирования возникает после ~ 190 повторных попыток. Однако при увеличении количества повторных попыток необходимо учитывать производительность. Последовательные новые запросы могут задерживаться в зависимости от количества повторных попыток для отдельного запроса.

Ссылки:

https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-request-throttling.html

https://aws.amazon.com/blogs/messaging-and-targeting/how-to-handle-a-throttling-maximum-sending-rate-exceeded-error/