AWS dynamodb loop PutItem vs BatchWrite

#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) Количество вставляемой записи.