我有一个节点应用程序,该应用程序使用pg-promise lib与Postgres对话。完全根据规定的最佳做法并使用pg-promise-demo进行设置。
应用程序的某些背景: 使用postgis数据库对各种表和返回分析进行约40个并行查询。每个并行查询(任务)都是通过API和套接字事件返回的。基本上将多边形作为关注区域,并在处理每个数据后返回40个事件。我们使用pm2运行节点进程并对其进行监视。
好消息,此方法在本地计算机或VM安装上非常漂亮且超级快速。将问题部署到Azure节点Web应用程序容器时,问题开始。
每个请求(感兴趣的区域)都会启动41个活动句柄(如下面的屏幕截图所示),对应于该池从postgres签出的连接。现在,在所有测试中,除了天蓝色,活动手柄一次增加41个,并根据负载增加更多。
处理数据后,postgres最终(约30秒)断开了连接(由pg_stat_activity
验证)。最终,节点进程中的活动句柄下降。
仅在Azure Web应用程序上,它们在节点应用程序中的这些活动句柄永不下降!会随着时间的推移不断攀升,最终导致应用程序崩溃。我已经确认postgres正确地删除了连接。只是该节点无法恢复这些句柄。因为代码在所有非Azure安装中都能完美地执行和扩展,所以很难调试为什么会发生这种情况。
我希望在这里可以为您提供想法,调试,监视或提示可能发生这种情况的线索。
pg-promise版本:8.4.0
操作系统类型(Linux / Windows / Mac):在Linux,mac和Windows上正常运行。但不在azure node docker container上。
Node.js版本:8.10.0(在Azure上为9.4.0)
答案 0 :(得分:1)
This was the issue,此版本自node-postgres
驱动程序的7.4.2版本开始已得到修复,这意味着如果您使用的是pg-promise的最新版本(目前为8.4.4),应该不再是这样的问题了。