Overview
在本指南中,您可以学习;了解Ruby驾驶员如何使用连接池来管理与MongoDB 部署的连接,以及如何在应用程序中配置连接池设置。
连接池是由Ruby驾驶员维护的打开数据库连接的缓存。当您的应用程序请求连接到MongoDB时,驾驶员会无缝地从池中获取连接,执行操作,然后将连接返回到池中以供重复使用。
连接池有助于减少应用程序延迟和Ruby驾驶员创建新连接的次数。
配置连接池
对于MongoDB拓扑结构中的每个服务器,每个 Mongo::Client实例都有一个内置连接池。如果不配置 min_pool_size 选项,连接池将按需打开连接,以支持应用程序中对MongoDB 的并发请求。
您可以在 Mongo::Client实例中指定以下连接池设置:
设置 | 说明 |
|---|---|
| The maximum number of concurrent connections that the pool maintains.
If the number of in-use connections to a server reaches the specified
value, the next request to that server waits until a connection becomes
available. Setting this option to 0 creates an unlimited connection pool.Default: 100 |
| The maximum number of connections that each pool can establish
concurrently. Default: 2 |
| The minimum number of concurrent connections that the pool maintains. Default: 0 |
| The maximum number of seconds that a connection can remain idle in
the pool. Default: 0 (no limit) |
max_pool_size
除了支持应用程序请求所需的连接之外,每个 Mongo::Client实例还为MongoDB拓扑结构中的每个服务器打开最多两个连接,用于监控服务器的状态。
示例,连接到三节点副本集的客户端会打开六个监控连接。如果应用程序使用 max_pool_size 的默认设置,并且仅查询主节点 (primary node in the replica set)(默认)节点,则连接池最多可以有 106 个打开的连接和 100 个连接。如果应用程序使用 读取偏好(read preference)来查询从节点(secondary node from replica set),则这些连接池会增长,总连接数可能为 306,包括打开的监控连接。
要在一个进程中支持大量并发 MongoDB 请求,可以增加 max_pool_size。
以下代码通过在 options对象中指定 max_pool_size 选项来创建最大连接池大小为 200 的 Mongo::Client实例:
require 'mongo' uri = "<connection-string>" client = Mongo::Client(uri, { max_pool_size: 200 })
max_connecting
连接池对连接建立进行速率限制。max_connecting 选项决定连接池在任何时候可以并行创建的连接数量。示例,如果 max_connecting 的值为 2,则仅当发生以下情况之一时,尝试同时签出连接的第三个请求才会成功:
连接池完成创建连接,且池中连接数少于
max_pool_size。现有连接会重新检入池中。
以下代码通过在 options对象中指定 max_connecting 选项,创建一个 Mongo::Client实例,其中每个池要同时建立最大数量 2 连接:
require 'mongo' uri = "<connection-string>" client = Mongo::Client(uri, { max_connecting: 2 })
min_pool_size
您可以使用 min_pool_size 选项设立每个服务器的最小连接数。驾驶员确保连接池的连接数始终至少达到 min_pool_size 选项设立的连接数。如果连接关闭,导致连接总数(包括使用中的连接和空闲的连接)下降到最小值以下,驾驶员将打开更多连接,直到达到最小值。
以下代码通过在 options对象中指定 min_pool_size 选项,创建一个最小连接池大小为 10 的 Mongo::Client实例:
require 'mongo' uri = "<connection-string>" client = Mongo::Client(uri, { min_pool_size: 10 })
注意
配置 max_idle_time 并将 min_pool_size设立为 0 的 Mongo::Client 对于具有持续低活动期的工作负载是最佳选择。此配置允许连接池在不活动期间关闭未使用的连接。
max_idle_time
您可以通过设置 max_idle_time 选项来设置一个连接在连接池中保持空闲状态的最大毫秒数。一旦 max_idle_time 的连接处于空闲状态,连接池就会将其删除并替换。此选项默认为 0(无限制)。
以下代码通过在 options对象中指定 max_idle_time 设置来创建最大空闲时间为 10000 毫秒(10 秒)的 Mongo::Client实例:
require 'mongo' uri = "<connection-string>" client = Mongo::Client(uri, { max_idle_time: 10000 })
关闭连接
当任何请求调用 Mongo::Client.close() 时, Ruby驾驶员会执行以下操作:
关闭连接池的所有空闲连接
关闭所有正在使用的连接,因为它们会返回到池中
仅当关联操作完成时才关闭所有正在使用的连接
调用 Mongo::Client.close() 仅会关闭非活动连接,而不会直接终止任何正在进行的操作。
注意
Mongo::Client.close() 方法会关闭现有会话和事务,这可能会间接影响正在进行的操作和打开的游标的行为。
避免连接超时
拥有大型连接池并不总能减少重新连接请求。请考虑以下示例场景:
某个应用程序的连接池大小为 5 个连接,并将
timeout_ms选项设立为 5000 毫秒。操作平均每 3000 毫秒发生一次,并且重新连接请求很频繁。
每个连接在 5000 毫秒后超时,这意味着所有连接都必须在这 5000 毫秒内执行某些操作以避免关闭。
在这种情况下,每个连接都会在 5000 毫秒后超时,因此需要在此超时期限内进行活动以避免关闭。但是,每 3000 毫秒一条消息不足以让所有连接保持活动状态,从而导致其中几个连接超时。
要避免过多的连接超时,请通过指定 max_pool_size 选项来减少驾驶员在连接池可以维护的连接数。要学习;了解如何设立max_pool_size 选项,请参阅本指南的max_pool_size部分。
API 文档
有关使用Ruby驾驶员创建 Mongo::Client对象和指定选项的更多信息,请参阅 Mongo::Client API文档的选项哈希部分。