Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在AWS lambda这样的无状态FAA上使用PostgreSQL是个好主意吗?_Node.js_Postgresql_Lambda - Fatal编程技术网

Node.js 在AWS lambda这样的无状态FAA上使用PostgreSQL是个好主意吗?

Node.js 在AWS lambda这样的无状态FAA上使用PostgreSQL是个好主意吗?,node.js,postgresql,lambda,Node.js,Postgresql,Lambda,我想在AWS lambda函数上使用Postgresql作为数据库,但我担心性能 我担心Lambda是无状态的,只在执行时存在,所以我想象每次触发Lambda时,它都会尝试启动一个全新的PG连接 我不确定这是否会降低性能或以某种方式导致陈旧连接出现问题。有人知道更多吗 我知道DynamoDB更符合Lambda,但我确实需要一个关系数据库,但同时Lambda的可伸缩性。您可以使用AWS Lambda的。调用lambda时,AWS会启动一个容器来运行处理程序函数中的代码。因此,如果在处理程序函数外部

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

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

我不确定这是否会降低性能或以某种方式导致陈旧连接出现问题。有人知道更多吗

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

您可以使用AWS Lambda的。调用lambda时,AWS会启动一个容器来运行处理程序函数中的代码。因此,如果在处理程序函数外部定义PG连接,它将在Lambda函数的调用之间共享。你可以在上面的链接中找到

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

const pg=require('pg');
const client=new pg.client();
exports.handler=(事件、上下文、cb)=>{
query('SELECT*FROM users WHERE',(err,users)=>{
//与用户打交道
cb(null);//干净地完成函数
});
};
参考博客文章

但有一个警告

编写Lambda函数代码时,不要假设AWS Lambda始终重用容器,因为AWS Lambda可能会选择不重用容器。根据各种其他因素,AWS Lambda可能只是创建一个新容器,而不是重用现有容器


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

每个任务将在Lambda上运行多长时间?我认为,只有当数据库连接时间占总时间的很大一部分时,这才重要,即使这样,如果您需要RDBMS功能,那么这可能是值得付出的代价。但首先我要尝试量化影响。@DavidAldridge通常一个lambda函数最多需要100-200ms,可能每个请求需要2次选择和1次插入。但我期待高并发性。你会推荐使用这个名为PostgREST的项目来绕过传统的连接握手吗?处理可能的连接限制,你可能还想寻找连接池。答案很好-确实非常有用!
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
});
};