【问题标题】:Why getting a response from AWS DynamoDB through Lambda from my React app is very slow?为什么从我的 React 应用程序通过 Lambda 从 AWS DynamoDB 获得响应非常慢?
【发布时间】: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


【解决方案1】:

您在这里实际测试什么?您的客户端和服务器之间的网络延迟是多少?如果您想计算 Lambda 的执行时间以及到 DynamoDB 的任何往返,则需要在函数内部进行。

【讨论】:

  • 你是对的,也许我对我想要实现的目标不够清楚。我试图理解为什么在 AWS Lambda 中测试 Lambda 函数(最大 100 毫秒)比从客户端调用它时(最小 220 毫秒但平均 250 毫秒及以上)执行得更快,所以我试图理解如何减少我的客户端和服务器之间的网络延迟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-02
  • 2015-11-23
  • 2020-02-27
  • 2016-06-07
  • 2021-12-02
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多