Пакет · cpool

Политика

PoolPolicy — неизменяемый объект-значение. У каждой настройки есть умолчание; задавайте именованными аргументами только то, что меняете.

php
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.

Дальше