0

我有以下项目设置:

  • 我们正在使用 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状态)超过数据库连接限制。

有没有人使用类似的应用程序设置并遇到过这个问题?或者有什么诀窍吗?

4

0 回答 0