设置
我正在构建一个使用网站前端的无服务器应用程序。网站向API发送查询,API连接到数据库。基础设施是托管在AWS上的,但我遇到的问题只影响了本地的发展。此设置的一个关键组件是无服务器API,它对每个API路由使用Lambdas。为了确保存在到数据库的连接,在执行处理程序之前,我连接到数据库并将该连接传递给ORM,并且为了确保在完成查询后没有空闲连接,我在处理程序完成后(无论是错误的还是优雅的)销毁它们。就实现而言,这些背后的逻辑是合理的。
堆栈
我正在使用Serverless离线插件运行Serverless,以便在本地开发Node 14应用程序。数据库是Postgres实例,我使用Objection.JS作为ORM连接到它。在引擎盖下,对象使用Knex管理连接、处理查询楼等。
版本
所用软件的版本。
(2.1.0)
问题
我遇到的问题是,当使用无服务器脱机在本地运行安装时,连接不可用。尽管在处理程序开始时连接到数据库,但有时API查询会抛出一个错误,说明无法获得连接,或者查询没有可用的数据库。这是间歇性的,有时相同的API调用执行时没有任何问题。
我已经意识到,只有在同时执行多个API查询时才会发生这种情况,尽管这一次并不总是这样。
伪码
无服务器离线中的lambda处理程序如下所示:
module.exports.handler = async function() {
const connection = await connectToDatabase();
await ORM.databaseConnection.setup(connection);
// ...
const results = ORM.executeQuery();
// ...
await ORM.databaseConnection.destroy();
return results;
}
发布于 2022-06-20 06:48:12
我花了很长时间才终于找到这个问题的根源,主要是因为它只会偶尔发生(当多个处理程序在本地运行时)。
我已经意识到,这些数据库连接导致错误(无法获得连接,无法执行查询)的原因是,无服务器脱机在共享进程中执行lambda处理程序,这意味着:
由一个lambda函数获得的由 ORM存储的Objection.JS连接将持久化到另一个在本地同时执行的lambda函数(这很好),但是当其中一个lambda破坏了它的连接时,第二个lambda就会失去它的连接,这意味着它将没有连接来执行针对的查询。
解决方案
当运行无服务器脱机时,这个问题的解决方案是将lambda处理程序作为单独的进程运行。这将导致每个处理程序的执行在不影响其他执行的情况下对自己的连接具有自主权。这可以通过向无服务器脱机命令中添加以下标志来实现:--useChildProcesses
,如下所示:
serverless-offline --useChildProcesses
https://stackoverflow.com/questions/72688902
复制