Реестр живых ячеек задуман так: ячейка, к которой давно никто не обращался, со временем выпадает из реестра и перестаёт греться. На крупном каталоге реестр не уменьшался никогда. Через день, через неделю, через две — одно и то же число.
Это девятая часть цикла «Кэш фрагментов и Redis».
Замкнутый круг
Реестр хранит для каждой ячейки время последнего обращения. Посчитали, сколько ячеек трогали за последние сутки: 31 115 из 31 115. Все. Хотя живые посетители трогают десятки ячеек в час.
Причин оказалось две:
- прогрев сам продлевал ячейке жизнь — отрендерил, отметил обращение. Ячейка жила, потому что её грели, а грели, потому что она жила;
- обходчик страниц тоже ставил отметки, когда находил блок в разметке: за час 49, за 6 часов 30 241, а за сутки и за 14 суток одинаково — 31 574.
Впервые измеренный размер задачи
Когда отметки перестали врать, впервые стало видно, сколько на самом деле надо греть: ожидается 31 680 ячеек, холодных — 24 264. И 88 % холодных — один блок: 294 товара × 96 вариантов вкладок.
Лечение
- продление жизни из прогрева убрать — функцию удалить целиком, а не выключить флагом;
- отмечать обращение посетителя и на HIT, а не только на MISS и STALE;
- при выборке брать свежее первым — сначала то, что недавно трогали;
- порция сторожа — 1000 (восьмая часть).
Эффект таких правок виден не сразу, а через дни: старые отметки должны истечь.
Решение: не сокращать ячейки
Естественный следующий шаг — выкинуть 96 вариантов вкладок, ведь живые посетители трогают около 55 ячеек в час из 31 574. Мы так не сделали.
Всё, что видно в разметке, — греть.
решение заказчика
Аргумент простой: память дешевле объяснений. Каждая выкинутая ячейка — это MISS для того посетителя, который её всё-таки откроет, и разговор «почему у меня медленно». А лишние мегабайты в Redis (четырнадцатая и пятнадцатая части) ничего не стоят.
Сокращать варианты можно только после недельного замера реального спроса — и то, если память действительно кончается.
Не понимаете, сколько ячеек у вас реально в работе?
Пришлите адрес — измерю реестр так, чтобы он не врал.
// загружаю комментарии…