连接池配置
EasySwoole\Pool\Config 可以接收数组,也可以通过 setter 链式设置。
完整配置项
| 配置项 | 默认值 | 单位 | 作用 |
|---|---|---|---|
maxObjectNum |
16 |
个 | 当前池最多创建的对象总数 |
minObjectNum |
8 |
个 | 预热及周期补充时希望保持的对象总数 |
getObjectTimeout |
3.0 |
秒 | 从 Channel 等待对象的默认时间 |
intervalCheckTime |
5000 |
毫秒 | 空闲对象健康检查周期,<= 0 表示关闭 |
intervalCheckBatchSize |
8 |
个 | 每轮最多检查多少个空闲对象 |
waitLoadAverageTime |
0.001 |
秒 | 平均等待时间低于该值时允许缩容 |
extraConf |
null |
— | 交给自定义连接池使用的额外配置 |
使用数组配置
use EasySwoole\Pool\Config;
$config = new Config([
'minObjectNum' => 2,
'maxObjectNum' => 20,
'getObjectTimeout' => 1.5,
'intervalCheckTime' => 10_000,
'intervalCheckBatchSize' => 5,
'waitLoadAverageTime' => 0.001,
'extraConf' => [
'host' => '127.0.0.1',
'port' => 6379,
],
]);
读取配置:
$max = $config->getMaxObjectNum();
$timeout = $config->getGetObjectTimeout();
$connectionConfig = $config->getExtraConf();
使用 setter
$config = (new Config())
->setMinObjectNum(2)
->setMaxObjectNum(20)
->setGetObjectTimeout(1.5)
->setIntervalCheckTime(10_000)
->setIntervalCheckBatchSize(5)
->setWaitLoadAverageTime(0.001)
->setExtraConf(['host' => '127.0.0.1']);
数量必须满足:
0 <= minObjectNum <= maxObjectNum
maxObjectNum >= 1
intervalCheckBatchSize >= 1
使用 setter 从默认值向下调整最大数量时,要先降低最小数量:
$config = (new Config())
->setMinObjectNum(1)
->setMaxObjectNum(4);
用构造数组时不存在调用顺序问题。
如何确定 maxObjectNum
不要简单地把值设得很大。连接上限要同时考虑:
- 数据库或 Redis 能接受的最大连接数。
- EasySwoole Worker、TaskWorker 和自定义进程数量。
- 同一进程中有多少个命名连接池。
- 单次请求是否可能同时借用多个连接。
例如数据库允许应用使用 200 个连接,服务有 8 个 Worker,并保留 40 个连接给发布重叠和后台任务,则 HTTP Worker 中每个池可以先按下面估算:
(200 - 40) / 8 = 20
这只是上限预算。实际还要根据下游吞吐、请求耗时和监控数据调整。
minObjectNum 与冷启动
minObjectNum 不会在 new Pool() 时立即创建连接。它是 keepMin() 和周期补充使用的目标数量。
如果希望 Worker 启动后立即准备连接,需要主动调用:
$pool->keepMin();
最小数量是“已创建对象总数”的目标,不是必须保持的空闲对象数;已借出的对象也计算在内。
运行中不要随意修改配置
Pool 保存的是同一个可变 Config 对象,但并非所有选项都适合运行时动态调整:
- 修改
maxObjectNum不会重建已经创建的 Channel。 - 修改
intervalCheckTime不会重新注册现有 Timer。 intervalCheckBatchSize会在下一轮检查时读取新值。
需要修改容量或检查周期时,更安全的方式是停止新请求、等待连接归还,然后重建连接池。