Увеличение производительности чтения из s3 лямбда-кода - PullRequest
1 голос
/ 11 июня 2019

Я читаю большой файл json из корзины s3.Лямбда вызывается несколько сотен раз в секунду.Когда параллелизм высок, лямбды начинают истекать.

Существует ли более эффективный способ написания приведенного ниже кода, при котором мне не нужно каждый раз загружать файл с S3 или повторно использовать содержимое в памяти для разных случаев лямбды: -)

Содержимое файла изменяется только один раз в неделю!

Я не могу разбить файл (из-за структуры json), и его нужно прочитать сразу.

s3 = boto3.resource('s3')
s3_bucket_name = get_parameter('/mys3bucketkey/')
bucket = s3.Bucket(s3_bucket_name)

try:
    bucket.download_file('myfile.json', '/tmp/' + 'myfile.json')
except:
    print("File to be read is missing.")

with open(r'/tmp/' + 'myfile.json') as file:
    data = json.load(file)

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Когда выполняется функция Lambda, она может проверить наличие файла в /tmp/, так как контейнер может быть использован повторно.

  • Если это , а не там, функция может скачать его.
  • Если файл уже уже существует, то нет необходимости его скачивать.Просто используйте его!

Однако вам придется выяснить, как обрабатывать еженедельные обновления.Возможно, изменение имени файла на основе даты?Или проверьте временную метку в файле, чтобы узнать, нужна ли новая?

0 голосов
/ 11 июня 2019

Возможно, вы не достигли ограничения скорости запросов https://docs.aws.amazon.com/AmazonS3/latest/dev/optimizing-performance.html, но стоит попробовать скопировать тот же файл S3 с другим префиксом.

Одно из возможных решений - избежать запроса S3 путем помещения файла JSON в код функции. Кроме того, вы можете добавить его в качестве лямбда-слоя и загрузить из / opt из вашей лямбды: https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html В этом случае вы можете автоматизировать обновление функции при обновлении файла s3, добавив еще одну лямбду, которая будет запущена по обновлению S3 и звоните https://docs.aws.amazon.com/lambda/latest/dg/API_UpdateFunctionCode.html

В качестве долгосрочного решения выберите Fargate https://aws.amazon.com/fargate/getting-started/, с помощью которого вы можете создавать сервисы на основе контейнеров с низкой задержкой и помещать файл в контейнер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...