【发布时间】:2020-09-13 09:48:41
【问题描述】:
我正在尝试使用 dynamo db 为测验风格的 Alexa 技能创建排行榜。我已经设置了表格并将用户添加到表格中,其中包含适当的数据,例如:
Item: {
"PlatformId": 2,
"UserId": 12345,
"Score": 100,
"NickName": "scott",
"Sport": "football",
}
在我的表中,主键是他们的 UserId,排序键是 PlatformId(这对所有用户都是一样的)。我有一个二级全局索引,它将 platformId 设置为主键,将分数设置为排序键。
在这个排行榜中,我希望对用户进行排名,得分最高的人是第一名,我的第一次尝试是使用二级索引扫描表格,这很好地返回了按分数排序的所有用户,但是有潜力为了在这个排行榜上有成千上万的用户,我发现扫描一个有 10000 多个用户的表的时间超过了 Alexa 技能的 8 秒响应时间。这会导致技能出错并关闭。
在超过响应时间之前,如果第一次扫描没有覆盖整个表,我会使用 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 创建排行榜的方法,可以更轻松地构建?
【问题讨论】:
标签: amazon-dynamodb alexa alexa-skill leaderboard