

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon RDS 代理提高应用程序的可扩展性、性能和可用性
<a name="introduction"></a>



*作者 Anand Komandooru、Noorul Hasan、Venkat Nalajala 和 Varun Kumar，Amazon Web Services（AWS）*

*2022 年 10 月*

本指南将介绍数据库连接池的需求、实施自我管理解决方案相关的挑战以及在 Amazon Web Services（AWS）上的应用程序架构中将 [Amazon Relational Database Service（Amazon RDS）代理](https://aws.amazon.com/rds/proxy/)和 Amazon RDS for PostgreSQL 结合使用的优势。

## 挑战
<a name="challenge"></a>

[PostgreSQL 是通过使用模型实现的。process-per-user client/server ](https://www.postgresql.org/docs/8.3/connect-estab.html)收到新连接后，主进程会启动一个子进程来处理这个新连接。然后，主进程等待下一个连接，而子进程负责与此新客户端连接相关的所有活动。数据库收到的每个新连接都会启动一个新的子进程。

许多应用程序（包括基于现代无服务器架构构建的应用程序）可能有大量到数据库服务器的开放连接。它们可能会高速打开和关闭数据库连接，耗尽数据库内存和计算资源。

频繁打开和关闭连接的事务性应用程序会遇到较高的连接延迟，导致每秒事务数减少。这将增加应用程序延迟。

当主数据库实例无法访问时，将发生失效转移，另一个实例将接管成为新的主数据库实例。这将中断客户端连接。如果失效转移是由滚动升级等管理操作引起的，则为计划内的；如果失效转移是由故障引起的，则为计划外的。在这两种情况下，操作员都必须减少停机时间，以尽量减少对客户的干扰。

## 常见做法
<a name="common-practice"></a>

为了应对应用程序可扩展性和性能方面的挑战，使用了连接池。连接池通过重复使用现有连接大大减少了连接延迟，提高了服务器上的数据库吞吐量（每秒事务数）。连接池会对无法立即从连接池提供服务的应用程序连接进行排队或限制。

实施连接池后，还会出现其他挑战。操作员必须自我管理基础设施和软件，才能操作连接池服务。为了处理失效转移事件，应用程序开发人员必须管理每个应用程序的连接复杂性。应用程序必须检测连接失败，发现新的主服务器，并尽快与之重新连接。

## 建议
<a name="recommendation"></a>

为了减少自托管连接池解决方案相关的挑战，同时利用其优势，我们建议针对您的工作负载评估 [Amazon RDS 代理](https://aws.amazon.com/rds/proxy/)。

RDS 代理是一种完全管理的高可用性数据库代理。RDS 代理使用[连接池](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.howitworks.html#rds-proxy-connection-pooling)来提高应用程序的可扩展性、数据库故障恢复能力和安全性。