AWS RDS сокращает время соединения с помощью Lambda

#mysql #node.js #amazon-web-services #amazon-rds-proxy

#mysql #node.js #amazon-веб-сервисы #amazon-rds-proxy

Вопрос:

Я вызываю свою базу данных AWS Rds из функции AWS lands. Я успешно могу вызвать базу данных просто отлично, но я пытаюсь сократить время выполнения. Я обнаружил, что 95% времени тратится на создание соединения с конечной точкой прокси-сервера AWS RDS. Есть ли способ ускорить это?

Приведенный ниже код обычно выполняется за 500-700 мс. mysql.createConnection() для завершения требуется от 400 до 600 мс. Сам запрос составляет <50 мс, а проверка JWT — <20 мс.

Index.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);
};
  

Database.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;
  }
};
  

Комментарии:

1. просто не создавайте новое соединение с базой данных при каждом вызове. повторно используйте подключение к базе данных из предыдущих вызовов.

2. находятся ли они в одном и том же AZ / регионе?

3. @Дипак, они оба в США-запад-2

Ответ №1:

в aws есть sth, который называется aws rds proxy в консоли lambda. проверьте это

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

Ответ №2:

Создание соединения с БД требует больших затрат времени на ввод-вывод. Именно по этой причине в любой производственной среде мы всегда создаем пул соединений. Любые серверы приложений, такие как JBoss и т. Д., Поддерживают пул соединений как саму функцию jboss. Даже режим гибернации поддерживает.

В бессерверном сценарии; вы можете создать соединение и сохранить его в памяти, как Redis / Memcached. Я бы предпочел redis. Они предоставляются как услуга через ElastiCache.