Я пытаюсь создать таблицу лидеров, используя Dynamo db для навыка Alexa в стиле викторины. Я настроил таблицу, и пользователи добавляются в таблицу со своими соответствующими данными, например:
Item: {
"PlatformId": 2,
"UserId": 12345,
"Score": 100,
"NickName": "scott",
"Sport": "football",
}
В моей таблице первичным ключом является их UserId, ключ сортировки - PlatformId (это то же самое для все пользователи). У меня есть вторичный глобальный индекс, который устанавливает platformId в качестве первичного ключа, а оценку - в качестве ключа сортировки.
В этой таблице лидеров я хочу, чтобы пользователи были ранжированы, причем наивысший результат - номер 1, моя первая попытка при этом нужно было сканировать таблицу с использованием вторичного индекса, это красиво возвращало всех пользователей, отсортированных по баллам, однако с потенциалом иметь тысячи пользователей в этой таблице лидеров, я обнаружил, что время сканирования таблицы с более чем 10000 пользователей превышает время отклика 8 секунд, которое есть у навыков Alexa. Это приводит к ошибке навыка и закрытию.
До того, как время ответа истекло, я использовал LastEvaluatedKey для выполнения дополнительного сканирования, если первое сканирование не охватило всю таблицу, но во втором сканировании выполняется, когда превышен лимит времени ответа. К сожалению, сканирование таблицы занимает слишком много времени.
dbHelper.prototype.scanGetUsers = (ad, newParams = null) => {
return new Promise((resolve, reject) => {
let params = {};
if (newParams != null) {
params = newParams
} else {
params = {
TableName: tableName,
IndexName: 'PlatformId-Score-index',
FilterExpression: "Score >= :s AND PlatformId = :p",
ProjectionExpression: `NickName, Sport, Score`,
// Limit: 10,
ExpressionAttributeValues: {
":p": User.PlatformId,
":s": User.Score,
},
}
}
docClient.scan(params, function (err, data) {
if (err || !data) {
console.error("Unable to read item. Error JSON:", JSON.stringify(err, null, 2));
return reject(JSON.stringify(err, null, 2))
} else {
console.log("scan users data succeeded:", JSON.stringify(data, null, 2));
if(data.LastEvaluatedKey) {
console.log("found a LastEvalutedKey, Continuing scan");
params.ExclusiveStartKey = data.LastEvaluatedKey;
data = data.concat(this.scanGetUsers(ad, params));
}
resolve(data);
}
});
});
}
Есть ли способ обойти эти проблемы, которые я еще не изучал? Или способ создать таблицу лидеров с помощью Dynamo db, которую можно было бы упростить?