Таблица лидеров Dynamo DB в навыках Alexa - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь создать таблицу лидеров, используя 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, которую можно было бы упростить?

1 Ответ

0 голосов
/ 01 июня 2020

Вы можете попробовать Ключ сортировки :

Когда вы объединяете ключ раздела и ключ сортировки, они создают составной ключ, и этот составной ключ является первичным ключом для отдельных элементы в таблице. С составным ключом вы получаете возможность использовать запросы с KeyConditionExpression против ключа сортировки. В запросе вы можете использовать KeyConditionExpression для написания условных операторов с помощью операторов сравнения, которые оценивают по ключу и ограничивают возвращаемые элементы. Другими словами, вы можете использовать специальные операторы для включения, исключения и сопоставления элементов по их значениям ключа сортировки.

В статье содержится вся информация о том, как его настроить и использовать.

...