Всплеск latency в момент истечения TTL популярного ключа
Расчёт свободных слотов записи кэшируется в Redis на 10 минут, ручку дёргают около 500 раз в секунду. Ровно каждые 10 минут p95 подскакивает с 80 мс до 2 секунд, а в мониторинге БД видно короткий всплеск одинаковых тяжёлых запросов.
Что происходит и как это лечат?
- Проблема в сети до Redis: раз в 10 минут соединения переустанавливаются и запросы встают в очередь; помогают постоянные соединения и конвейеризация команд
- В момент промаха все параллельные запросы уходят считать одно и то же в БД. Пересчёт должен выполнять один процесс под блокировкой по ключу, либо значение обновляют заранее, до истечения TTL
- Достаточно увеличить TTL до суток: всплеск станет реже, данные почти не устареют, а редкий скачок p95 раз в сутки укладывается в допустимый уровень обслуживания
- Нужно кэшировать не в Redis, а в памяти PHP-процесса: обращение к локальному массиву быстрее сетевого вызова, промахов не будет и всплеск исчезнет
