Есть две проблемы, с которыми вы сталкиваетесь, но я попытаюсь их решить.
Полный пример написанных элементов и фактический запрос batchWrite
с указанными элементами не был предоставлен, поэтому неясно, правильно ли отформатирован фактический запрос. На основании предоставленной информации и проблемы, с которой вы столкнулись, создается впечатление, что запрос неправильно отформатирован.
Документацию по операции batchWrite
в AWS Javascript SDK можно найти здесь и предыдущий ответ здесь показывает решение для правильного построения и форматирования запроса batchWrite
.
Тем не менее, даже если запрос отформатирован правильно, все еще существует вторая проблема, заключающаяся в том, что имеется достаточно ресурсов для обработки запросов на запись для вставки 1800 записей в требуемое количество времени, которое имеет верхний предел5 секунд.
TL; DR быстрое и простое решение проблемы с пропускной способностью состоит в переключении с Предоставленная емкость на По требованию емкость. Как показано ниже, математика показывает, что если у вас нет согласованных и / или прогнозируемых требований к емкости, большую часть времени емкость по требованию будет не только устранять накладные расходы на управление выделенной емкости, но такжебыть значительно дешевле.
В соответствии с документацией AWS DynamoDB для выделенной емкости здесь , Write Capacity Unit
или WCU
оплачивается и, таким образом, определяется следующим образом:
Каждый вызов API для записи данных в вашу таблицу является запросом на запись. Для элементов размером до 1 КБ один WCU может выполнять один стандартный запрос записи в секунду.
Документация AWS для batchWrite / batchWriteItem
API здесь указывает, что batchWrite
Запрос API поддерживает до 25 элементов на запрос, а отдельные элементы могут быть до 400 КБ. Кроме того, количество WCU, необходимое для обработки запроса batchWrite
, зависит от размера элементов в запросе. Документация AWS по управлению емкостью в DynamoDB здесь сообщает, что количество WCU, необходимое для обработки запроса batchWrite
, рассчитывается следующим образом:
BatchWriteItem
- записывает до25 предметов для одной или нескольких таблиц. DynamoDB обрабатывает каждый элемент в пакете как отдельный запрос PutItem или DeleteItem (обновления не поддерживаются). Таким образом, DynamoDB сначала округляет размер каждого элемента до следующей границы в 1 КБ, а затем вычисляет общий размер. Результат не обязательно совпадает с общим размером всех элементов. Например, если BatchWriteItem записывает элемент размером 500 байт и элемент размером 3,5 КБ, DynamoDB вычисляет размер как 5 КБ (1 КБ + 4 КБ), а не 4 КБ (500 байт + 3,5 КБ).
Размер элементов в запросе batchWrite
не предоставлен, но ради этого ответа делается предположение, что они составляют <1 КБ каждый. Если в запросе содержится 25 элементов размером менее 1 КБ, то для обработки одного запроса batchWrite требуется минимальная выделенная емкость в 25 WCU <em>в секунду . Предполагая, что подготовлено минимум 25 необходимых WCU, учитывая 5-секундный лимит времени на вставку элементов, при условии предоставления всего 25 WCU, можно сделать только один запрос с 25 элементами в секунду, что составляет 125 элементов, вставленных за 5-секундный интервал времени. Исходя из этого, для достижения цели вставки 1800 элементов за 5 секунд для достижения цели необходимо 360 WCU.
Исходя из текущих расценок на установленную пропускную способность, найденных здесь , 360 выделенных мощностей WCU обойдутся примерно в 175 долларов в месяц (без учета бесплатных уровней).
Существует два варианта решения этой проблемы
- Увеличение выделенной емкости. Чтобы набрать 1800 предметов за 5 секунд, вам нужно подготовить 360 WCU.
- Лучше всего просто переключиться на
On Demand
емкость. В вопросе упоминалось, что запросы на запись являются «случайными операциями». Если запросы на запись не являются предсказуемыми и последовательными операциями над таблицей, то результатом часто является чрезмерное предоставление таблицы и оплата простоя. Емкость «по требованию» решает эту проблему и придерживается философии «без сервера» - платить только за то, что вы используете, когда вам выставляется счет только за то, что вы потребляете. В настоящее время цена по требованию составляет 1,25 долл. США на 1 млн. Куб. Исходя из этого, если каждый новый пользователь генерирует 1800 новых элементов для вставки, потребуется 97 223 новых пользователя в месяц, прежде чем предоставление емкости для таблицы будет конкурентоспособным по сравнению с использованием емкости по требованию. Иными словами, пока новый пользователь не регистрируется в среднем каждые 26 секунд, математика предлагает придерживаться емкости по требованию (стоит отметить, что это не учитывает RCU или другие элементы в таблице или другие схемы доступа).