使用pg-promise的连接池

5
我正在使用Node.js和PostgreSQL,并尝试在连接实现中做到最高效。
我看到pg-promise是建立在node-postgres之上的,而node-postgres使用pg-pool来管理池。
我也读到过“同时有超过100个客户端是非常糟糕的事情”(node-postgres)。
我正在使用pg-promise,想知道:
  1. 对于大量数据负载,推荐的poolSize是多少?
  2. 如果poolSize = 100且应用程序同时收到101个请求(甚至更多),会发生什么? Postgres会处理顺序并使第101个请求等待直到可以运行吗?
2个回答

19

我是pg-promise的作者。

我在使用Node.js和PostgreSQL,并尝试在连接实现方面提高效率。

数据库通信有几个优化级别。其中最重要的是尽量减少每个HTTP请求的查询次数,因为IO是昂贵的,连接池也是如此。

我看到pg-promise是建立在node-postgres之上的,而node-postgres使用pg-pool来管理池。

从6.x版本开始,node-postgres开始使用pg-pool,而pg-promise仍然停留在5.x版本,使用内部连接池实现。这是原因

我也读到,“一次超过100个客户端非常糟糕”

根据我的长期实践经验表明:如果您的服务无法适应20个连接的池,那么增加更多的连接并不能解决问题,您需要修复您的实现。此外,当连接数超过20时,会给CPU带来额外的负担,这将导致进一步的减速。

对于大量数据,建议使用什么样的poolSize?

数据大小与连接池大小无关。通常,您只使用一个连接进行单个下载或上传,无论大小如何。除非您的实现有误并且最终使用了多个连接,否则您需要修复它,如果您想要使您的应用程序具有可伸缩性。

如果poolSize = 100并且应用程序同时获取101个请求会发生什么?

它将等待下一个可用的连接。


另请参见:


这还是最新的吗?pg-promise还在使用pg-pool v5吗?如果我不使用pg-promise,我是否仍然需要像以前一样使用pg-pool? - SamGoody
@SamGoody 不,那个信息已经过时了6年。只需使用最新的pg-promise,就可以了。 - vitaly-t

1
如果poolSize = 100,而应用程序同时获得101个请求(甚至更多),会发生什么?Postgres会处理顺序并使第101个请求等待直到可以运行它吗?
是的,请求将被排队。但它不是由Postgres本身处理的,而是由您的应用程序(pg-pool)处理的。因此,每当您用完空闲连接时,该应用程序将等待一个连接释放,然后执行下一个挂起的请求。这就是池的作用。
对于非常大的数据负载,推荐的poolSize是多少?
这实际上取决于许多因素,没有人会告诉您确切的数字。为什么不在巨大负载下测试您的应用程序,并查看其实际表现,并找出瓶颈呢?

我发现node-postgres文档在这个问题上非常令人困惑和误导:

一旦您有100个以上的并发请求,您的Web服务器将尝试打开100个到PostgreSQL后端的连接,您的PostgreSQL服务器将耗尽内存,您的数据库将变得无响应,您的应用程序将似乎挂起,一切都会崩溃。糟糕!

https://github.com/brianc/node-postgres

这并不完全正确。如果在Postgres端达到连接限制,您将无法建立新的连接,直到任何先前的连接关闭。如果您在Node应用程序中处理此情况,就不会出现任何问题。


请问什么时候连接会被释放或可用?我对此不太确定。我在使用 AWS Lambda 时遇到了很多超时问题,也不知道如何管理连接池。也许我没有正确释放连接,导致达到了限制。谢谢。 - demian85
阅读文档,它包含了很好的示例。至于释放连接池,调用 pool.query() 完成后调用 pool.end()。 如果您已经这样做了,那么问题可能出在其他地方。 - pumbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接