使用Knex.js进行的每个DB查询打开和关闭与RDS代理的连接有哪些好处



我的Lambda函数使用的Postgres查询生成器Knex使用准备好的语句,所以我无法完全利用RDS Proxy,因为会话是固定的。我试图确保lambdas运行的时间尽可能短,以便固定会话尽快完成,并将其连接返回到池中。

我想知道如何使会话更短、更精细,并考虑使用每个查询创建和关闭与AWS RDS Proxy的连接。

我应该考虑哪些性能因素来确定这种方法的可行性?

我在想的事情:

  • RDS代理连接开销(延迟和内存(
  • RDS代理将关闭的连接返回到池并使其可供他人重复使用所需的时间(尚未找到相关文档(
  • Knex本地连接池的开销

AWS建议在构建具有Lambda功能的应用程序时使用RDS代理。关系数据库不是为了处理大量的连接而构建的,而Lambdas可以扩展到数千个实例。

RDS代理连接开销(延迟和内存(

这肯定会增加您的延迟,但您会看到数据库的CPU和内存使用率有很大提高,这将最终防止不必要的故障。当您可以在lambda端进行许多其他优化时,这是一个很好的权衡。

RDS代理将关闭的连接返回池并使其可供其他人重复使用所需的时间(尚未找到有关此方面的文档(

使用Lambdas时,您应该在完成逻辑处理后立即断开与RDS代理的连接,而无需担心RDS代理返回关闭的连接所需的时间。一旦断开连接,RDS代理会在其维护的连接池中保持一定时间。如果另一个lambda同时尝试建立连接,它可以共享池中仍处于热状态的同一连接。在正确的时间从lambda中删除数据库连接将节省lambda处理时间->钱

Knex的本地连接池的开销

我建议不要使用带有lambda的Knex本地连接池,因为这不会有任何好处(将池的最大值保持为1(。每个lambda执行都是独立于另一个执行的,池永远不会共享,并且在执行完成后连接也不会持久,除非您计划将其与serverless-offline类型的本地框架一起用于开发目的。

阅读有关AWS Lambda+RDS代理使用的更多信息:https://aws.amazon.com/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/

AWS关于在何处使用RDS代理的文档:https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy-planning.html