Как я могу уменьшить задержку между Lambda и DynamoDB?
Это лямбда Java, и для выполнения каждой из 2 операций DynamoDB с использованием SDK, поставляемого AWS, требуется 4 секунды.Я слышал, что они обычно завершаются в течение <20 мс, но для меня это на 3 порядка выше.Эти длинные операции: (а) создание объекта DynamoDB и (б) выполнение сканирования таблицы на <em>полностью пустой таблице (код ниже).
Что я должен сделать, чтобы уменьшить задержку?
Вещи, которые я пробовал
- И лямбда, и DynamoDB находятся в одном регионе (eu-west-1).
- В таблице 5 RCU &ВКА.Увеличение их не помогает.
- Максимальный объем памяти, используемый лямбда-памятью, составляет 92 МБ.Если я выделю минимум 128 МБ, то это произойдет через 15 секунд.Увеличение памяти до 512 МБ позволяет достичь времени 4 с на вызов, а увеличение ее до 1 ГБ уменьшает ее до 2 с на вызов.Тем не менее, это абсурдный объем памяти для тривиальной лямбды, и все равно у меня остается> 200x ожидаемая задержка.
- Метрики таблицы показывают, что время сканирования таблицы составляет от 12 мс до 15 мс.Это то, что я ожидал.Даже с учетом накладных расходов на установление сетевого соединения я все еще ожидаю несколько десятков миллисекунд, а не нескольких секунд.
- Я запускаю лямбда-функцию, используя функцию тестирования в консоли AWS.Я также пытался запускать через API-шлюз (что я и буду делать в конечном итоге) с теми же результатами.
- Я пытался вызвать лямбду несколько раз в быстрой последовательности (чтобы уменьшить вероятность того, что ямучаюсь настройкой затрат).Это не помогло.
- В журнале показано, что все остальные части лямбды работают очень быстро (в миллисекундах).
Фрагменты кода
Создание DynamoDBобъекты
log("Creating AmazonDynamoDB");
AmazonDynamoDB db = AmazonDynamoDBClientBuilder
.standard()
.withRegion(Regions.EU_WEST_1)
.build();
log("Creating DynamoDBMapper");
DynamoDBMapper mapper = new DynamoDBMapper(db);
Выполнение сканирования
log("Scanning table");
List<MyItem> items = dbMapper.scan(MyTable.class, new DynamoDBScanExpression());
for (MyItem item : items) {
// Irrelevant - there aren't any
}
log("Table scan complete");
Примеры журналов
А вот журналы из прогона.
20:07:41 START RequestId: 9d436db7-5d32-11e8-8555-8564d2094ccc Version: $LATEST
20:07:41 Received request: APIGatewayRequest(path=/data/foo, httpMethod=POST, body=)
20:07:41 Creating AmazonDynamoDB
20:07:45 Creating DynamoDBMapper
20:07:45 Creating DataHandler
20:07:45 Handling request
20:07:45 Scanning table
20:07:49 Table scan complete
20:07:49 Request handled - response object: []
20:07:49 APIGatewayResponse(isBase64Encoded=false, statusCode=200, body=[], headers={})
20:07:49 END RequestId: 9d436db7-5d32-11e8-8555-8564d2094ccc
20:07:49 REPORT RequestId: 9d436db7-5d32-11e8-8555-8564d2094ccc Duration: 8256.47 ms Billed Duration: 8300 ms Memory Size: 512 MB Max Memory Used: 85 MB