【发布时间】:2020-10-01 20:53:57
【问题描述】:
我正在测试 Amazon AWS 和 DynamoDB 的可能性,但是,我找不到关于为什么我的 Lambda 函数延迟执行的解决方案。
我在 DynamoDB 中使用 React 和一个简单的表(小于 1kb)设置了一个非常简单的测试应用程序。在反应我有这个电话:
async readTasks() {
axios.get("https://13n6ump8q4.execute-api.us-east-1.amazonaws.com/default/serverlessToDoFunctionGET")
.then(res => {
let tasks = res.data.Items
this.setState({
tasklist:tasks,
});
});
}
通过 AWS API Gateway 连接到我的 Lambda serverlessToDoFunctionGET 函数:
const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region: "us-east-1"});
exports.handler = function(event, context, callback) {
let scanningParameters = {
TableName: "todo-app",
Limit:20
};
docClient.scan(scanningParameters, function(err, data) {
if(err){
callback(err, null);
} else {
callback(null, data);
}
});
}
当我从 AWS 控制台测试 Lambda 函数时,它的平均执行时间介于 30-100 毫秒之间(忽略冷启动值),这很棒。
但是,当我从我的应用程序(本地和部署)运行它时,平均执行时间约为 250 毫秒!我得到的最低值仍然是惊人的 220 毫秒。
我在这里做错了什么?为了让我在我的应用程序中使用 DynamoDB,我需要低于 100 毫秒,否则就不值得了。
我尝试过的东西,但没有任何效果:
- 将 Lambda 函数内存大小从 128MB 增加到 3008MB
- 仔细检查区域是否相同
- 我没有在 React 中使用 axios,而是在 componentDidMount() 中使用了 fetch
【问题讨论】:
-
为什么要使用扫描操作?为什么不查询?如果这是主要访问模式,则应该是查询,而不是扫描。很有可能是您的基表上的架构有误,或者您需要 GSI 来查询这种特定的访问模式。
-
感谢您的建议,我将尝试查询操作而不是扫描。即使它稍微影响速度,我仍然不明白为什么 AWS Lambda 测试面板中的 Lambda 函数在 100 毫秒以下执行,但从客户端调用时却需要超过 200 毫秒。
标签: reactjs amazon-web-services axios amazon-dynamodb serverless-framework