如何處理來自 Lambda 的 MySQL 數據庫連接/池 -> RDS with Node
我在測試我的 Lambda 函式時遇到了一些問題。我是我的測試,我並行
N
執行我的 Lambda 函式。在我的 lambda 函式中,我通過 Knex 檢索數據庫連接。我在搞亂 db init 中的設置pool: { min: 0, max: [1 or 5] }
,這似乎可以修復/破壞事情,這取決於我的程式碼中的其他事情。執行我的 lambda 函式 20 次輸出正確的結果,但是,當我達到 500 時(我期望在生產中看到的很容易超過這個),事情就開始崩潰了。我遇到了諸如
Error: ER_CON_COUNT_ERROR: Too many connections
,之類的錯誤(如果我在 lambda 函式的末尾Error: pool is draining and cannot accept work
使用 Knex 的介面)。knex.destroy()
在 AWS Lambda 和 RDS 中處理連接和池以擴大規模的正確方法是什麼?如果我要在 AWS 上執行相同的壓力測試,我在本地機器上看到的問題會重現嗎?
剝離數千個程序來完成一項任務的微小部分很簡單。但效率低下。“流程”是重量級的。執行緒有些沉重。數以千計的 MySQL 連接是可能的,但不能同時連接。
在任何多程序或多執行緒環境中,“太多”都會減慢速度。這是因為作業系統(或某些實體)正在做大量工作來共享不足的資源。例如,MySQL 可以處理數百個空閒連接,但會因為幾十個活動連接而陷入困境。當超過這個值時,最好沿著鏈向上到達客戶端,並限制它產生新連接的頻率。
我不熟悉你提到的其他產品,但我建議將同時活動減少到幾十個,而不是幾百個。
或者想辦法。在您的應用程序中,“迭代”而不是“遞歸”。同時,請記住,MySQL 更樂於處理數據的“向量”(表)而不是處理單個行。也許您可以將應用程序中的一些“並行”作為“向量”推送到 MySQL 中?雙贏:連接更少;MySQL 中的效率更高。
該錯誤是由於與數據庫的連接數,每個 Lambda 函式將至少打開一個,並且在您的情況下,該數量超過了您的 RDS 實例中可用的連接數。
通過 AWS 控制台你可以提升它,只需要尋找 max_connections,這裡是一步一步的教程:
https://github.com/jollygoodcode/jollygoodcode.github.io/issues/16
根據此連結(許多其他連結顯示類似的值),這裡是每個實例大小支持的連接數的表:
MODEL max_connections t1.micro 34 m1-small 125 m1-large 623 m1-xlarge 1263 m2-xlarge 1441 m2-2xlarge 2900 m2-4xlarge 5816
希望能幫助到你