使用pg-promise的连接池

mic*_*Dia 4 postgresql node.js pgpool node-postgres pg-promise

我正在使用Node js和Postgresql,并试图在连接实现中最有效率.
我看到pg-promise建立在node-postgres之上,而node-postgres使用pg-pool来管理池.
我还读到"一次超过100个客户端是一件非常糟糕的事情"(node-postgres).

我正在使用pg-promise并想知道:

  1. 对于非常大的数据负载,推荐的poolSize是什么?
  2. 如果poolSize = 100并且应用程序同时获得101请求(甚至更多)会发生什么?Postgres是否处理订单并使101请求等待它可以运行它?

vit*_*y-t 9

我是pg-promise的作者.

我正在使用Node js和Postgresql,并试图在连接实现中最有效率.

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

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

node-postgres从版本6.x开始使用pg-pool,而pg-promise保留在使用内部连接池实现的版本5.x上.这就是原因所在.

我还读到"一次超过100个客户是一件非常糟糕的事情"

我在这个领域的长期练习表明:如果你不能将你的服务放入20个连接的池中,你就不会通过寻求更多连接来保存,你需要修改你的实现.此外,通过超过20,你开始给CPU带来额外的压力,这转化为进一步减速.

对于非常大的数据负载,推荐的poolSize是什么?

数据的大小与池的大小无关.无论多大,您通常只使用一个连接进行单次下载或上传.除非您的实现是错误的并且您最终使用多个连接,否则您需要修复它,如果您希望您的应用程序可扩展.

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

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


也可以看看:


Ale*_*exM 1

  1. 如果 poolSize = 100 并且应用程序同时收到 101 个请求(甚至更多),会发生什么情况?Postgres 是否处理订单并让 101 请求等待,直到它可以运行它?

是的,请求将被排队。但它不是由 Postgres 本身处理,而是由您的应用程序 ( pg-pool) 处理。因此,每当您用完可用连接时,应用程序都会等待连接释放,然后执行下一个待处理的请求。这就是池的用途。

  1. 对于非常大的数据负载,建议的 poolSize 是多少。

这确实取决于很多因素,没有人会真正告诉你确切的数字。为什么不在巨大的负载下测试您的应用程序,看看它在实践中的表现如何,并找到瓶颈。


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

一旦您同时收到超过 100 个请求,您的 Web 服务器将尝试打开 100 个与 PostgreSQL 后端的连接,您将耗尽 PostgreSQL 服务器上的内存,您的数据库将变得无响应,您的应用程序似乎会挂起,一切都会崩溃。嘘!

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

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