#amazon-web-services #aws-lambda #amazon-dynamodb
#amazon-веб-сервисы #aws-лямбда #amazon-dynamodb
Вопрос:
Привет, мне просто интересно, может ли кто-нибудь дать мне разъяснения о преимуществах batchwrite
Если у нас есть, скажем, 36 элементов, которые мы хотим записать в dynamodb, я использую лямбда-функцию AWS, и, как я ее вижу, у меня есть два варианта (псевдокод)
Вариант первый
for item in items:
putItem(item)
Второй вариант
for item in items:
if cnt < 25
batch.push(item)
if cnt == 25
batchWrite(batch)
cnt = 0
cnt
Я чувствую, что первый вариант быстрый и грязный, но если мои товары редко будут превышать 100, это так плохо (я бы тайм-аут моего лямбда и т. Д.)?
В любом случае, было бы здорово получить разъяснения по этому поводу.
Комментарии:
1. Использование API BatchWriteItem, при условии, что это уместно, сократит количество вызовов API в AWS, количество выполняемых TCP-соединений (потенциально) и совокупную задержку ваших запросов (потенциально). Вы можете измерить две альтернативы, чтобы увидеть, какая разница на самом деле имеет значение в вашем конкретном случае.
2. «.. API вызывает AWS, ..» мы говорим о вызовах из лямбда-выражения в dynamodb? и что лямбда-выражение может создавать новое TCP-соединение с каждым запросом put? Ценю ответ
3. Да, каждый вызов PutItem является отдельным вызовом API для DynamoDB. Я не уверен, какой уровень повторного использования соединения происходит с используемым вами AWS SDK (boto3?), Но это стоит изучить.
4. Да, boto3, спасибо за понимание
Ответ №1:
Для обоих ваших вариантов вам следует реализовать какую-то параллельную отправку для лучшего контроля и производительности, например, Promise.allSettled в JS и asyncio parallel в python.
Как упоминалось в комментариях выше, использование batchWrite
фактически уменьшает количество вызываемых запросов, но одно критическое ограничение заключается в том, что он принимает только до 25 запросов и общий размер 16 МБ в одном пакетном запросе, если вы ожидаете, что запросы превысят это ограничение, вам нужно, и вы должны реализовать способразделить запросы на несколько пакетов, чтобы размер каждого пакета составлял менее 25 запросов и 16 МБ.
Использование putItem
более простое, чем использование batchWrite
, поскольку оно не имеет ограничений, упомянутых выше. Но опять же, вы будете инициировать множество запросов API.
Оба метода не влияют на стоимость, поскольку AWS взимает плату не за количество вызываемых к ним API в соответствии с их описанием цен, а за фактические данные, записываемые и считываемые из таблицы DynamoDB, которые, как известно, являются WCU и RCU соответственно. Кстати, за передачу данных плата не взимается.
В заключение, для обоих putItem
и batchWrite
, что вас должно беспокоить, это (1) как реализовать запросы и обработать повторную попытку в случае ошибки. (2) Количество вставляемой записи.