连接池管的是什么
客户端连接池限制的是并发与排队:池里连接数有上限,超出的请求先排队,排队超时就快速失败。MongoDB 驱动提供 maxPoolSize、minPoolSize、waitQueueTimeoutMS;Elasticsearch 客户端按节点维护连接并支持超时重试;Redis 客户端通常复用少量长连接。真正容易出问题的是分层:连接超时、读写超时、整体超时、重试次数彼此独立,任何一层配置失当都会让故障被放大。
基本信息
| MongoDB 驱动 | maxPoolSize、minPoolSize、waitQueueTimeoutMS、serverSelectionTimeoutMS、socketTimeoutMS |
|---|---|
| Elasticsearch 客户端 | request_timeout、max_retries、retry_on_timeout、maxsize(连接数) |
| Redis 客户端 | socket_connect_timeout、socket_timeout、health_check_interval、连接池上限 |
| 权限要求 | 无特殊权限,均由客户端配置决定 |
| 服务端上限 | 数据库侧的最大连接数、文件描述符与内存要与客户端总和匹配 |
典型使用场景
- 实例扩容前核算连接总量:单实例池上限乘以实例数必须低于服务端连接上限
- 故障期间避免请求无限排队:给排队设超时,让请求尽早失败而不是拖死线程
- 为只读副本配置独立连接池或读偏好,避免报表查询挤占业务连接
- 排查「连接被重置」「Too many connections」时逐层核对客户端池与服务端上限
- 配置重试策略时区分幂等与非幂等写入,避免重试把重复数据写进库
连接参数示例
连接参数示例
# MongoDB:池上限 + 排队超时 + 选节点超时,三者一起配才有意义
# mongodb://app:pwd@m1:27017,m2:27017/app?replicaSet=rs0\
# &maxPoolSize=50&minPoolSize=5&waitQueueTimeoutMS=5000&serverSelectionTimeoutMS=3000
# Elasticsearch 客户端:整体超时要小于上游网关超时,重试次数与退避一起考虑
from elasticsearch import Elasticsearch
es = Elasticsearch("http://es:9200", request_timeout=10, max_retries=3, retry_on_timeout=True)
# Redis:短连接超时 + 定期健康检查,避免拿到已被服务端关闭的死连接
import redis
r = redis.Redis(host="127.0.0.1", port=6379, socket_timeout=1, socket_connect_timeout=0.5,
health_check_interval=30, max_connections=100)参数逐项读法
| 参数 | 作用 | 配置要点 |
|---|---|---|
| maxPoolSize | 单进程可持有的最大连接数 | 乘以上游实例数得到数据库连接总量,务必小于服务端上限 |
| minPoolSize | 常驻连接数 | 过小会让突发流量先付建连成本,过大则空闲连接占用服务端资源 |
| waitQueueTimeoutMS | 池满后的排队上限 | 给明确上限,超时即失败,避免请求在队列里无限堆积 |
| serverSelectionTimeoutMS | 选到可用节点的时间上限 | 主节点切换期间应大于切换耗时,否则会出现大量瞬时失败 |
| request_timeout | 单次请求整体超时 | 要小于上游调用方的超时,否则内部仍忙时外层已判失败 |
客户端实例要按进程复用:每个请求新建客户端会反复建连,既增加延迟又可能耗尽连接与服务端文件描述符;连接池监控指标(等待时长、池大小)应接入告警。
重试只应对幂等且瞬时失败的操作启用,并配指数退避与抖动;服务端已经过载时无限重试会把缓慢变成雪崩。