在使用AWS lambda这样的无状态FaaS上使用PostgreSQL是一个好主意?

我想在我的AWS lambda函数中使用Postgresql作为数据库,但是我担心性能。

我担心Lambdas是无状态的,只是在执行的时候才存在,所以我想像每次Lambda被触发时,它都会尝试启动一个全新的PG连接。

我不知道这是否会降低性能或以某种方式导致旧的连接问题。 任何人都知道更多这个?

我知道DynamoDB更符合Lambda,但我确实需要一个关系数据库,但同时也是Lambda的可扩展性。

您可以使用AWS lambda的容器执行模型 。 在调用lambda时,AWS会旋转容器以在处理函数内部运行代码。 因此,如果您在处理程序函数外部定义PG连接,它将在Lambda函数的调用中共享。 你可以在上面的链接find。

您的Lambda函数代码中的任何声明(处理程序代码外部,请参阅编程模型)都将保持初始化,以便在再次调用该函数时提供额外的优化。 例如,如果您的Lambda函数build立数据库连接,而不是重新build立连接,则在随后的调用中将使用原始连接。 您可以在您的代码中添加逻辑,以在创build连接之前检查连接是否已经存在。

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 }); }; 

参考这个博客文章。

但是有一个警告。

在编写Lambda函数代码时,请勿假定AWS Lambda始终重复使用容器,因为AWS Lambda可能会select不重复使用容器。 根据各种其他因素,AWS Lambda可能只是创build一个新的容器,而不是重新使用现有的容器。

另外,您可以创build一个计划作业来预热lambda函数。 (每5分钟运行一次)