我想在我的AWS lambda函数中使用Postgresql作为数据库,但我担心性能。
我担心Lambdas是无国籍的,只有在他们执行的时候才存在,所以我想每次Lambda被触发它都会尝试启动一个全新的PG连接。
我不确定这是否会降低性能或以某种方式导致陈旧连接出现问题。谁知道更多关于这个?
我知道DynamoDB更符合Lambda,但我确实需要一个关系数据库,但同时还具有Lambda的可扩展性。
答案 0 :(得分:2)
您可以使用AWS lambda的container execution model。调用lambda时,AWS会旋转一个容器来运行处理函数内的代码。因此,如果在处理函数之外定义PG连接,它将在Lambda函数的调用之间共享。您可以在上面的链接中找到它。
Lambda函数代码中的任何声明(在处理程序代码之外,请参阅编程模型)仍然初始化,在再次调用函数时提供额外的优化。例如,如果Lambda函数建立数据库连接,而不是重新建立连接,则在后续调用中使用原始连接。您可以在代码中添加逻辑,以在创建连接之前检查连接是否已存在。
const pg = require('pg');
const client = new pg.Client(<connection_string>);
exports.handler = (event, context, cb) => {
client.query('SELECT * FROM users WHERE ', (err, users) => {
// Do stuff with users
cb(null); // Finish the function cleanly
});
};
参考this博文。
但有一点需要注意。
编写Lambda函数代码时,请不要假设AWS Lambda始终重用容器,因为AWS Lambda可能选择不重用容器。根据各种其他因素,AWS Lambda可能只是创建一个新容器,而不是重用现有容器。
此外,您可以创建预定作业来预热lambda函数。 (每5分钟运行一次)