我应该关闭 AWS Lambda 函数内的 RDS 代理连接吗?

2024-03-20

我将 Lambda 与 RDS Proxy 结合使用,以便能够重用与 MySQL 数据库的数据库连接。

我应该在执行查询后关闭连接还是将其保持打开状态以供 RDS 代理处理?

如果我应该关闭连接,那么首先使用 RDS 代理的意义何在?

这是我的 lambda 函数的示例:

const mysql = require("mysql2/promise")

const config = {
  host: process.env.RDS_HOST, // RDS Proxy endpoint here
  user: process.env.RDS_USER,
  database: process.env.RDS_DATABASE,
  password: process.env.RDS_PASSWORD,
  ssl: "Amazon RDS"
}

exports.handler = async (event) => {
  let connection

  try {
    connection = await mysql.createConnection(config)
    console.log(`Connected to db. ConnectionId: ${connection.threadId}`)

    // Do some queries
  } catch (err) {
    return handleError(err)
  } finally {
    if (connection) await connection.end() // Should I close the connection here?
  }

  return response(200, "Success")
}

EDIT:请注意,在处理程序外部初始化连接(全球范围 https://docs.aws.amazon.com/lambda/latest/operatorguide/global-scope.html) 将使 lambda 函数在同一执行环境中的调用之间保留连接变量的值,这将导致以下错误连接处于关闭状态时无法添加新命令当在短时间内多次调用 lambda 函数时,因为连接在第一次调用时已经关闭,所以我最好建议在处理程序内部而不是外部定义连接。


TDLR:始终关闭数据库连接

RDS 代理位于您的应用程序和数据库之间,除了使用代理端点之外,不应导致任何应用程序更改。


我应该在执行查询后关闭连接还是将其保持打开状态以供 RDS 代理处理?

无论您是否使用数据库代理,都不应该让数据库连接保持打开状态。

连接是一种有限且相对昂贵的资源。

经验法则是尽可能晚地打开连接并尽可能晚地关闭数据库连接soon尽可能。未显式关闭的连接可能不会添加或返回到池中。关闭数据库连接是一个好的数据库客户端。

让数据库资源与许多开放连接相关联,您会发现自己的数据库实例需要更多 vCPU,这会导致 RDS 代理价格更高。


如果我应该关闭连接,那么首先使用 RDS 代理的意义何在?

关键是您的 Amazon RDS 代理实例维护与 RDS 数据库实例的已建立连接池 https://aws.amazon.com/rds/proxy/ for you- 它坐between您的应用程序和 RDS 数据库。

代理不负责关闭您建立的本地连接,也不应该这样做。

它负责通过管理连接多路复用/池和自动共享来为需要它的应用程序提供帮助。

一个例子需要它的应用程序中明确提到AWS docs https://aws.amazon.com/rds/proxy/:

许多应用程序,包括那些构建于现代无服务器架构,可以有大量到数据库服务器的开放连接,并且可能会以很高的速率打开和关闭数据库连接,耗尽数据库内存和计算资源。


为了避免任何疑问,也请随意查看 AWS 提供的关闭连接的示例here https://github.com/awsdocs/aws-lambda-developer-guide/blob/main/sample-apps/rds-mysql/dbadmin/index.js(链接至来自docs https://docs.aws.amazon.com/lambda/latest/dg/configuration-database.html#configuration-database-sample),或 AWS 计算博客中的另一篇文章here https://aws.amazon.com/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该关闭 AWS Lambda 函数内的 RDS 代理连接吗? 的相关文章

随机推荐