Политика
PoolPolicy — неизменяемый объект-значение. У каждой настройки есть умолчание;
задавайте именованными аргументами только то, что меняете.
use Flytachi\Winter\CPool\PoolPolicy;
new PoolPolicy(maximumPoolSize: 20, maxLifetime: 600.0);
PoolPolicy::default(); // все значения по умолчаниюЁмкость
| Параметр | По умолчанию | Что делает |
|---|---|---|
maximumPoolSize |
10 |
Жёсткий потолок числа открытых соединений |
connectionTimeout |
15.0 |
Сколько заёмщик ждёт, прежде чем получить exhausted() |
Это одно решение, а не два. Потолок превращает «слишком много соединений» из отказа на стороне базы в очередь на стороне приложения; таймаут решает, насколько длинной этой очереди позволено вырасти, прежде чем запрос сдастся.
Как прикидывать размер: потолок — свойство базы, делённое на число воркеров,
которые с ней говорят. Четыре воркера Swoole против PostgreSQL с max_connections = 100, с запасом на миграции и psql, — это скорее maximumPoolSize: 15, чем 100.
Пул на потолке — не всегда мал
Прежде чем поднимать лимит, поищите borrow() без парного release(): каждая такая
утечка навсегда уменьшает рабочий размер пула на единицу, и симптом выглядит
одинаково.
Срок жизни
| Параметр | По умолчанию | Что делает |
|---|---|---|
maxLifetime |
1800.0 |
Соединение старше этого выселяется при выдаче |
maxLifetimeJitter |
0.1 |
Доля maxLifetime, на которую разбрасывается срок |
Зачем вообще выселять исправное соединение: прокси, балансировщики и failover-адреса переезжают под долгоживущими сокетами. Соединение, открытое час назад, может исправно отвечать, указывая при этом на сервер, который выводят из ротации. Переоткрытие — способ следовать за инфраструктурой, которой пул не видит.
Джиттер здесь не украшение. Десять соединений, созданных при старте с одинаковым сроком, истекут в одну секунду — и приложение встанет, пока все десять переподключаются. Десять процентов от получаса растягивают это на три минуты.
Проверка живости
| Параметр | По умолчанию | Что делает |
|---|---|---|
aliveBypassWindow |
0.5 |
Пропустить проверку для соединения, использованного недавно |
Поставьте 0.0 — проверка пойдёт на каждой выдаче: корректно и удваивает round-trip’ы
нагруженного сервиса. Увеличьте — сломанный сокет проживёт чуть дольше до обнаружения.
Умолчание исходит из того, что соединение, ответившее полсекунды назад, живо; если база
упала именно в этом окне, запрос упадёт, и вызывающий выселит соединение сам.
Фоновая уборка
| Параметр | По умолчанию | Что делает |
|---|---|---|
housekeepingInterval |
30.0 |
Как часто проходит подметание |
keepaliveTime |
0.0 |
Пинговать соединения, простоявшие дольше (0 — выключено) |
idleTimeout |
0.0 |
Закрывать простоявшие дольше (0 — выключено) |
minimumIdle |
0 |
Не опускаться ниже этого числа |
housekeepingEnabled() ложно, пока не задан keepaliveTime или idleTimeout, а таймер
заводится только под Swoole. С умолчаниями таймера нет вовсе — простаивающий пул не
стоит ничего.
keepaliveTime включают, когда файрвол или база рвут простаивающие соединения:
периодический пинг не даёт им тихо умирать между запросами. idleTimeout — когда
трафик всплесками и держать пиковый пул всю ночь расточительно; тогда же задают
minimumIdle, чтобы следующий всплеск не начинался с нуля.
Настройки противоположны по смыслу: одна удерживает соединения живыми, другая позволяет
их отпустить. Включать обе осмысленно — держать тёплый минимум, остальное отпускать, —
если задан minimumIdle.
Дальше
- Справочник API — где каждая настройка применяется
- Свой адаптер —
validate()под окном пропуска