我看到pg-promise是建立在node-postgres之上的,而node-postgres使用pg-pool来管理池。
我也读到过“同时有超过100个客户端是非常糟糕的事情”(node-postgres)。
我正在使用pg-promise,想知道:
- 对于大量数据负载,推荐的poolSize是多少?
- 如果poolSize = 100且应用程序同时收到101个请求(甚至更多),会发生什么? Postgres会处理顺序并使第101个请求等待直到可以运行吗?
我是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个请求会发生什么?
它将等待下一个可用的连接。
另请参见:
我发现node-postgres
文档在这个问题上非常令人困惑和误导:
一旦您有100个以上的并发请求,您的Web服务器将尝试打开100个到PostgreSQL后端的连接,您的PostgreSQL服务器将耗尽内存,您的数据库将变得无响应,您的应用程序将似乎挂起,一切都会崩溃。糟糕!
https://github.com/brianc/node-postgres
这并不完全正确。如果在Postgres端达到连接限制,您将无法建立新的连接,直到任何先前的连接关闭。如果您在Node应用程序中处理此情况,就不会出现任何问题。
pool.query()
完成后调用 pool.end()
。
如果您已经这样做了,那么问题可能出在其他地方。 - pumbo
pg-promise
,就可以了。 - vitaly-t