Я использую DynamoDB для запроса некоторых данных.Внизу вы можете увидеть количество миллисекунд для определенного процента запросов.
Большую часть времени DynamoDB работает нормально с временем отклика около 100 мс.(есть только запросы по первичному ключу или индексам).Около 0,4% запросов занимают более 800 мс (что является пределом, который служба должна предоставлять для ответа) даже в «спокойные» времена.Это не идеально, но достаточно хорошо.
Однако определенная нагрузка (которая даже не большая) вызывает поведение DynamoDB, которое приводит к тому, что около 5% запросов имеют время отклика 2000 мс.В одном запросе есть несколько запросов, но если один из этих запросов занимает более 800 мс, весь запрос завершается вызывающим абонентом.
Мы используем Node.js, и вот как мы используем библиотеку AWS:
Вот так мы запускаем библиотеку
const dynamodb = new AWS.DynamoDB.DocumentClient({
region: config.server.region,
});
/// ...
dynamodb.query(params).promise()
Пример запроса
{
"TableName":"prod-UserDeviceTable",
"KeyConditionExpression":"#userId = :userId",
"ExpressionAttributeNames":{
"#userId":"userId"
},
"ExpressionAttributeValues":{
":userId":"e3hs8etjse3t13se8h7eh4"
},
"ConsistentRead":false
}
Еще несколько замечаний:
- ЦП службы в настоящее времяавтоматическое масштабирование ниже 10%, более высокая нагрузка или использование процессора не ухудшают работу сервиса, мы даже пытались достичь 50% с тем же временем отклика
- Нет "увеличения" времени отклика.Его обычно меньше 100 мс, а затем из ниоткуда его 2000 на 1-5%.Как видно из графика
- В запросах не используется ConsistentRead
- Мы используем глобальные таблицы в 4 регионах.Это происходит во всех регионах (служба развернута независимо во всех 4 регионах)
- Метрики DynamoDB для используемых таблиц не показывают скачков времени отклика
- Служба развернута в ECS Fargate,но он был развернут ранее в ECS EC2 с теми же результатами
- Все таблицы во всех регионах по требованию
- Задержка 2000 мс происходит в любом месте службы в течение времени жизни запроса при запросе динамодат (= происходит для разныхзапросы, даже для разных таблиц)
- Когда я повторяю тот же запрос, который снова занял более 2000 мс, он занимает всего 100 мс или меньше