2017-07-21 211 views
5

我已將AWS Lambda函數連接到Amazon RDS(MySQL)。當同時調用Lambda函數100次時,在RDS中將打開幾乎400個連接(如RDS控制檯所示)。爲什麼是這樣?AWS Lambda RDS連接太多

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE DB = "MYDB"; 

所有的連接都從LAMBDA容器:

我使用檢查活動連接。有誰知道Lambda容器如何處理同時發生的請求?爲什麼容器不能重複使用?

當前配置:

var sequelize = new Sequelize('DB','username', 'password' ,{ dialect: 'mysql', port: port, host: host, pool: { max: 20, min: 0, idle: 300000 } });

即使一個連接每個請求打開它應該是100 400個如何連接被打開?

我正在使用Sequelize。節點JS 6.9.1

注:連接只發生一次外LAMBDA處理方法

+0

由於大量相同的請求,它可能會將其數據庫連接擴展到預計會有這麼多負載的級別。 你可以嘗試保持連接,並在 –

+0

之後稍等一會兒放入下一個請求它可以重用容器,但這對於Web應用程序不是必需的嗎?併發是Web應用程序的基本原則。爲什麼Lambda需要這些容器來處理100個請求? –

回答

0

Sequelize通過默認創建一個連接池,所以它的創建4個連接,因爲它的目的是作爲一個長期運行的服務運行。您可以通過將options.pool設置爲false來禁用此功能,請參閱the API reference

但是,隨着應用程序的擴展,這是Lambda不會消失的一個基本問題。我建議在EC2中構建數據庫代理層來終止數據庫連接(即使用ProxySQL)。它會有一個連接池到RDS數據庫。

解決此問題的唯一方法是使用dynamodb作爲後端存儲。

+0

DynamoDb的限制是問題所在。我們不能爲此而努力。如何構建數據庫代理層?任何參考? –

+0

我已經更新了關於如何在Sequelize中禁用連接池的評論。我還添加了一個可以使用的DB代理的示例。 – Robo

+0

沒有得到它。據說可以提高緩存和性能。它如何解決我的連接問題? –