我有以下项目设置:
- 我们正在使用 python nameko 框架来相互通信微服务(使用 RabbitMQ 作为传输)
- 在生产环境中,容器使用 docker-swarm 编排器进行管理。
- 使用PostgreSQL DB + SQLAlchemy ORM + nameko-sqlalchemy库
- 数据库连接池配置为
NullPool
,因此池被禁用,我们按需签出连接。
但是,当我们有巨大的 RPC 请求负载(每秒超过 1k)时,我们偶尔会遇到此错误:
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
我们假设问题可能在于在短时间内签出和连接到数据库,因此我们尝试QueuePool(pool_size=N, max_overflow=M)
了(使用pre_ping=True
)。我们确信 N+M 远低于 database max_connections
。但是,随着时间的推移,此设置会导致以下问题:
sorry, too many clients already
因为存在连接泄漏......可能(?)nameko服务重新启动后,新idle
连接被创建而不关闭旧连接,并且随着时间的推移,我们的服务创建的连接(通常处于idle
状态)超过数据库连接限制。
有没有人使用类似的应用程序设置并遇到过这个问题?或者有什么诀窍吗?