簡體   English   中英

使用 Knex.js 進行的每個數據庫查詢打開和關閉與 RDS 代理的連接的缺點?

[英]Downsides to opening and closing a connection to RDS Proxy with every DB query made with Knex.js?

我的 Lambda 函數使用的 Postgres 查詢生成器Knex使用准備好的語句,因此我無法充分利用 RDS 代理,因為會話已固定。 我嘗試確保 lambda 運行的時間盡可能短,以便固定的 session 盡快完成並將其連接返回到池中。

我想知道如何才能使會話更短、更細化,並考慮在每次查詢時創建和關閉與 AWS RDS 代理的連接。

我應該考慮哪些性能因素來確定這種方法的可行性?

我在想的事情:

  • RDS Proxy 連接開銷(延遲和內存)
  • RDS Proxy 將關閉的連接返回到池中並使其可被其他人重用所花費的時間(無法找到關於此的文檔)
  • Knex 本地連接池的開銷

在構建具有 Lambda 函數的應用程序時使用 RDS 代理是 AWS 推薦的基礎設施模式。 關系數據庫不是為處理大量連接而構建的,而 Lambda 可以擴展到數千個實例。

RDS Proxy 連接開銷(延遲和內存)

這肯定會增加您的延遲,但您會看到 CPU 和 memory 數據庫使用率有了很大改善,這最終會避免不必要的故障。 當您可以在 lambda 端進行許多其他優化時,這是一個很好的權衡。

RDS Proxy 將關閉的連接返回到池中並使其可被其他人重用所花費的時間(無法找到關於此的文檔)

在使用 Lambdas 時,您應該在完成邏輯處理后立即斷開與 RDS 代理的連接,而不必擔心 RDS 代理返回已關閉的連接所需的時間。 連接斷開后,RDS 代理會在它維護的連接池中將其保持一段時間。 如果另一個 lambda 嘗試同時建立連接,它可以共享池中仍然熱的相同連接。 在正確的時間從您的 lambda 中刪除數據庫連接將為您節省 lambda 處理時間 -> 金錢。

Knex 本地連接池的開銷

我建議不要將 Knex 本地連接池與 lambda 一起使用,因為它不會有任何好處(將池最大值保持為 1)。 每個 lambda 執行都獨立於另一個執行,池永遠不會共享,執行完成后連接不會持續存在,除非您計划將其與serverless-offline類型的本地框架一起用於開發目的。

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

關於在何處使用 RDS 代理的 AWS 文檔: https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/rds-proxy-planning.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM