使用pg-promise的连接池

时间:2017-04-06 09:05:39

标签: node.js postgresql node-postgres pg-promise pgpool

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

我使用pg-promise并想知道:

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

2 个答案:

答案 0 :(得分:7)

我是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上。 Here's the reason why

  

我也读到了#34;一次超过100个客户是非常糟糕的事情"

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

  

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

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

  

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

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

另见:

答案 1 :(得分:1)

  
      
  1. 如果poolSize = 100并且应用程序同时获得101请求(甚至更多)会发生什么? Postgres是否处理订单并使101请求等到它可以运行它?
  2.   

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

  
      
  1. 对于非常大的数据负载,建议使用什么poolSize。
  2.   

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

此外,我发现node-postgres文档在这个问题上非常混乱和误导:

  

一旦获得> 100个并发请求,您的Web服务器将尝试打开100个与PostgreSQL后端的连接,并且您的PostgreSQL服务器上的内存不足,您的数据库将变得无响应,您的应用程序似乎挂起,一切都会破裂。 Boooo!

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

事实并非如此。如果达到Postgres端的连接限制,您将无法建立新连接,直到任何先前的连接关闭。如果您在节点应用程序中处理这种情况,那么什么都不会破坏。