我有一個 Lambda POST 函式,它接受 http 請求 JSON 正文資料并將其添加到連接的 MySql 資料庫中。
代碼如下:
var mysql = require("mysql");
var config = require("./config.json");
var pool = mysql.createPool({
host: config.dbhost,
user: config.dbuser,
password: config.dbpassword,
database: config.dbname,
port: 3306,
ssl: true,
});
exports.handler = (event, context, callback) => {
context.callbackWaitsForEmptyjsonLoop = false;
pool.getConnection(function (err, connection) {
const col1 = event.col1;
const col2 = event.col2;
const col3 = event.col3;
// Use the connection
connection.query(
"INSERT INTO table (col1, col2, col3) VALUES(?, ?, ?)",
[col1, col2, col3],
function (error, results, fields) {
// And done with the connection.
connection.release();
var response = {
statusCode: 200,
body: JSON.stringify("Account added successfully!"),
};
// Handle error after the release.
if (error) callback(error);
else callback(null, response.body);
}
);
});
};
我有一個非常相似的 lambda 函式,它從 JSON 更新資料庫中的記錄,并且它運行完美。
測驗代碼時,記錄成功添加到資料庫中。但是,無論我將超時限制設定為多長時間,lambda 函式都會超時。
lambda 回傳此錯誤:
{ "errorMessage": "2021-10-14T10:00:25.159Z 62f12d68-c648-4f0f-9e86-3cd23f0f90c6 Task timed out after 5.01 seconds" }
日志的最后兩行是:
Thu Oct 14 10:00:25 UTC 2021 : Successfully completed execution
Thu Oct 14 10:00:25 UTC 2021 : Method completed with status: 200
我已經將代碼作為運行它的本地檔案進行了測驗:node local.js它運行迅速且沒有錯誤。
不知道我錯過了什么。也許INSERT INTO查詢的回傳型別與UPDATE?
任何幫助,將不勝感激。謝謝
uj5u.com熱心網友回復:
問題的評論中已經給出了答案,但我想在這里更深入一點,因為在 lambda 函式中使用連接池(大部分)沒有用,甚至可能有害。
為什么它沒有用
連接池旨在在您可能希望同時處理多個不同操作的應用程式中處理與資料庫的多個并行連接(例如,同時處理多個請求的快速 API)。但是,AWS Lambda 旨在同時僅處理單個請求,并為每個并行執行提供不同的執行環境。這意味著您將從您的資料庫中請求更多您實際需要的連接。
為什么它可能很糟糕
您無法控制 lambda 執行環境的終止方式。這也意味著您不能確保連接池中的連接會正常關閉,也不能確保資料庫服務器會為您關閉它們。如果您隨后在 lambda 執行中獲得大量增加(通過增加流量或通過在 lambda 中創建回圈 - 這很容易完成)您可以非常迅速地吃掉資料庫可用的所有可用連接,這可能會影響資料庫的所有其他客戶也是如此。這通常以與經理的非常不舒服的談話結束(去過那里,做過那件事)。
那怎么辦呢?
嗯,實際上非常簡單,創建一個連接,使用它并再次關閉它。下面是這樣一個處理函式的一個例子(使用 postgres db,但應該很容易適應使用 MySQL):
const pgp = require('pg-promise')();
const getDBConfiguration = require('./db-config');
let dbOptions; // dbOptions are retrieved from SSM param store, we can cache those
const handler = async (event) => {
dbOptions = dbOptions || { ...(await getDBConfiguration()), max: 1 }; // restrict number of connections in pool to one
const client = pgp(dbOptions);
try {
await client.any(/*Execute some query*/);
} finally {
await client.$pool.end();
}
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/319065.html
