RDS 代理是否会影响当前应用程序端池?

Ner*_*eph 9 mysql proxy connection-pooling amazon-rds amazon-rds-proxy

我在 AWS ECS 上有一个 Saas 应用程序,在 AWS RDS 上有一个数据库。我们计划实施 AWS RDS 代理来实现池化。从RDS代理文档中,我看到我们不需要对应用程序代码进行任何更改。目前,我们正在使用应用程序端连接池。当我们实现RDS代理进行池化时,当前的池化有什么影响吗?

我们是否需要删除应用程序端池才能有效地与 RDS 配合使用?

我主要担心的是,如果我在 RDS 代理和应用程序池配置中选择 100% 池化,如果我们将其限制为 100 个最大连接。这会成为瓶颈吗?

jto*_*ron 17

TLDR:将连接池保留在您的应用程序中,并将其大小设置为应用程序的一个实例(例如 ECS 任务或 EKS pod)所需的连接数。

中间有一个数据库代理,“连接”有两个独立的分支:

  1. 首先,存在从应用程序到代理的连接。您所说的“应用程序端池”就是这种类型的连接。由于创建此类连接的新实例仍然存在相关开销,因此继续在应用程序中使用连接池可能是一个好主意。
  2. 其次,存在从代理到数据库的连接。这些连接由代理管理。这种类型的连接数量由代理配置控制。如果将此配置设置为 100%,则允许代理使用数据库的max_connectionsvalue,而其他客户端可能会缺乏连接。

因此,当您的应用程序想要使用连接时,它需要从本地池中获取连接。然后,代理需要将其与数据库连接配对。代理将尽可能重用与数据库的连接(此技术也称为多路复用)。或者,引用官方文档:“您可以同时打开许多与代理的连接,并且代理会保留与数据库实例或集群打开的较少数量的连接。这样做可以进一步最大限度地减少数据库服务器上连接的内存开销。这该技术还减少了出现“连接过多”错误的可能性。”

当您的容器编排器(例如 ECS 或 EKS)水平扩展您的应用程序时,您的应用程序将打开/关闭与代理的连接,但代理将防止您的数据库因这些更改而不堪重负。