我的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