【问题标题】:AWS RDS reducing connection time from LambdaAWS RDS 减少了 Lambda 的连接时间
【发布时间】:2021-02-27 18:06:03
【问题描述】:

我从 AWS lands 函数中调用我的 AWS Rds 数据库。我成功地能够很好地调用数据库,但我正在尝试减少执行时间。我发现 95% 的时间都花在创建与 AWS RDS 代理端点的连接上。有没有办法加快速度?

下面的代码通常在 500-700 毫秒内运行。 mysql.createConnection() 需要 400-600 毫秒才能完成。查询本身

索引.js

'use strict';

const constants = require("./constants");
const OktaJwtVerifier = require('@okta/jwt-verifier');
const Database = require('./database');
const verifier = new OktaJwtVerifier({
    'issuer': 'https://preview.okta.com/oauth2/default'
});
let db = new Database({
    "host": process.env["rds_proxy_endpoint"],
    "user": process.env["db_user"],
    "database": process.env["database"],
    "password": process.env["db_pass"]
});

let start;
let end;
exports.handler = async(event) => {
    let response = {};
    console.log("Starting JWT Validation");
    start = new Date();
    await verifier.verifyAccessToken(event.token, 'api://default').catch(err => {
        console.log("Invalid Token");
        response.statusCode = constants.HTTPSTATUS_UNAUTHORIZED;
        response.body = err.userMessage;
    });
    end = new Date() - start;
    console.log("JWT Verification Time: %dms", end);
    
    let params = ["string"];
    
    return await db.execute("CALL GetUsersGames(?)", params);
};

数据库.js

'use strict';

const mysql = require('mysql2/promise');
const constants = require('./constants');

let start;
let end;
module.exports = class Database {
  constructor(config) { 
    this.config = config;
  } 
  
  async execute(proc, params){
    let response = {};
    try {
      console.log("Creating connection...");
      start = new Date();
      let connection = await mysql.createConnection(this.config);
      end = new Date() - start;
      console.log("Connection Execution Time: %dms", end);
      start = new Date();
      const rows = await connection.execute(proc, params);
      end = new Date() - start;
      console.log("Query Time: %dms", end);
      //console.log(JSON.stringify(rows));
      response["statusCode"] = constants.HTTP_OK;
      response["body"] = JSON.stringify(rows[0][0]);
    } catch(err){
        console.log("ERROR: " + err);
        response["statusCode"] = constants.HTTP_INTERNAL_SERVER_ERROR;
        response["body"] = "Internal Server Error";
    }
    return response;
  }
};

【问题讨论】:

  • 只是不要在每次调用时创建新的数据库连接。重用之前调用的数据库连接。
  • 他们在同一个 AZ/Region 吗?
  • @Deepak,他们都在 us-west-2

标签: mysql node.js amazon-web-services amazon-rds-proxy


【解决方案1】:

创建数据库连接是高 I/O 操作。这就是在任何生产环境中我们总是创建连接池的原因。像 JBoss 等任何应用程序服务器都支持连接池作为 jboss 功能本身。甚至休眠也支持。

在无服务器场景中;您可以创建连接并将其保存在内存中,如 Redis/Memcached。我更喜欢redis。它们通过 ElastiCache 作为服务提供。

【讨论】:

    【解决方案2】:

    aws 在 lambda 控制台中有一个叫做 aws rds 代理的东西。看看吧

    https://aws.amazon.com/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/

    【讨论】:

      猜你喜欢
      • 2017-07-25
      • 2017-12-27
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-23
      • 2021-06-10
      • 2018-02-11
      相关资源
      最近更新 更多