管理用户请求的挑战
大多数应用程序都让用户不断发送出于不同目的和活动的请求。某些应用程序可能有很多请求,而其他应用程序可能有较少请求。此外,这些用户请求的频率和间隔也各不相同。
每当用户发送请求时,后端数据库或服务器都需要执行多项活动来打开连接、维护连接和关闭连接。多种资源用于执行这些功能。
什么是连接池?
连接池是在后端服务器上拥有活动连接池的过程。每当用户发送请求时都可以使用这些。服务器不会在用户发送请求时打开、维护和关闭连接,而是为用户分配活动连接。
一旦用户完成其过程,活动连接将被添加回连接池。这样,开销操作的数量大大减少,优化了服务器的性能,解决了交易频率低和延迟高的问题。
什么时候应该使用连接池?
连接池机制可以用于以下场景:
- 当打开、维护和关闭连接的开销太大而服务器无法处理时。
- 当应用程序需要JDBC连接对象时。
- 当需要在多个用户之间共享同一事务的连接时。
- 当应用程序不管理其自己的连接池以执行创建连接或搜索用户名等操作时。
连接池的明显好处是它提高了服务器性能。有趣的是,使用池化的服务器的运行速度几乎是不使用该策略的服务器的两倍。
连接池和 Postgres
Postgres 是一个开源关系数据库管理系统 (RDBMS),由社区志愿者积极开发超过 15 年。
Postgres 被 Web 和移动平台上的各种应用程序使用,拥有各种工具并提供外键、SQL 子选择、热备用(从 9.0 开始)、视图和触发器等功能。
Postgres 也有用于连接池的工具。生态系统中有多种工具:
- pgpool提供连接池、负载平衡、高可用性和复制功能。
- pgbouncer是仅用于连接池的首选工具。
- pgcat是用 Rust 重写的 pgbouncer,支持副本之间的负载平衡、副本在健康检查失败时的故障转移以及池化级别的分片。
您可以根据您的项目要求使用这些工具中的任何一个。然而,Pgbouncer 是两者中更轻量级的连接池。Pgbouncer 支持三种主要类型的池化:
- 会话池: 这是默认方法,在客户端连接的生命周期内将连接分配给客户端应用程序。一旦客户端应用程序断开连接,连接就会添加回池中。
- 事务池: 在此方法中,每个事务的连接都分配给客户端应用程序。一旦事务结束,连接就会被添加回池中。
- 语句池:为每个语句分配连接。一旦语句完成,连接就会被释放。该方法不支持多语句事务。
什么是 Yandex/Odyssey?
Pgbouncer 是单线程池化器,而 Odyssey 支持多核和多线程处理。该工具具有以下特点:
多线程处理
这一功能使人们能够设置多个工作线程来处理连接。使用单线程处理时,只能同时处理一个指令和请求线程。然而,这里可以同时处理许多线程。由此,后端数据库的处理能力得到数倍的扩展。
进化池机制
Odyssey 的交易池方法比 Pgbouncer 更加进化。如果客户端在分配连接后在事务中意外断开连接,它会自动将客户端回滚到之前的状态并取消连接。
此外,Odyssey 可以记住其最后一个服务器连接所有者客户端,这意味着数据库为每个客户端到服务器分配设置客户端选项的开销较小。
除了上述两个功能之外,还有许多其他功能,例如全功能 SSL/TLS 支持、将连接池定义为数据库和用户的能力、每个池的单独身份验证等等。
这些更先进的功能只有通过 Odyssey 的架构才能实现。让我们看看它有何贡献。
建筑学
有一个实例来管理传入的客户端连接请求。它下面是具有多个工作线程的工作池,可以处理传入的连接。与该工作池并行的是具有路由器、服务器、控制台和 cron 的系统。
- 该实例是应用程序请求的入口点并处理初始化过程。
- 然后系统启动路由器、cron 和控制台。它监听传入的请求,当有传入连接时,它会通知工作池。
- 路由器负责客户端到服务器的连接和分离以及客户端池排队等操作。
- 工作线程负责在队列上收到传入连接请求时为客户端创建协程,并处理客户端连接的完整生命周期。另一方面,工作池负责管理所有线程。
有时,多线程结构可能会产生很大的通信开销,例如当请求较少且请求时间相对较短时。在这种情况下,存在一种单一工作模式,其中不是为每个工作线程创建单独的线程和协程,而是在系统线程内仅创建一个工作协程。
虽然 Odyssey 和 Pgbouncer 在具有服务器的应用程序中可以很好地充当连接池,但还有另一种解决方案可以在无服务器环境中实现连接池。这些是代理服务器。在概述此解决方案之前,我们需要绕道讨论一下无服务器应用程序的工作原理。
无服务器应用程序
并不是所有的应用程序都需要服务器,因为维护服务器非常麻烦,成本更高,而且浪费很大。结果,一些应用程序变成了无服务器。
在无服务器应用程序中,当用户发出请求时,会创建一个实例,在该实例中满足他们的请求,然后销毁该实例。因此,本质上,这些实例是微型容器,仅运行满足客户端请求所需的代码,并且没有其他通信开销。
无服务器环境给想要使用 Odyssey 或 Pgbouncer 等工具的开发人员带来了一定的挑战。
Odyssey的架构是这样的,每个实例都管理整个连接池。在无服务器环境中,会发出大量请求,并为每个请求创建和销毁一个实例。
这意味着当有多个请求时,将创建多个实例,这意味着将有多个连接池,它们之间不会进行通信,因为它们并不都属于一台服务器。因此,如果数据库过载,他们将无法协调和通信。
因此,Odyssey 将无法在无服务器环境中提供连接池服务。
这就是 Prisma Data Proxy 发挥作用的地方。
什么是代理?它们如何工作?
代理服务器是一种数据管理平台充当客户端和数据库之间中介的解决方案。该代理服务器可以管理来自数据库的流量。
这是最近提出的解决方案,仍处于早期阶段。然而,它看起来很有前途,甚至很容易处理,具有干净的布局和可导航的用户界面。
通过使用连接字符串或单击创建新连接字符串,您可以为无服务器应用程序设置 Prisma 数据代理并管理连接池。