Что именно кешируется
Фреймворки при запуске обходят все файлы с описанием маршрутов и строят таблицу соответствия адресов обработчикам. На большом проекте это занимает заметное время, поэтому результат сохраняют в кеш и при каждом запросе читают готовую таблицу.
Что это даёт
- ускоряется обработка каждого запроса;
- снижается нагрузка на процессор сервера;
- сокращается время до первого байта, что полезно и роботу.
Типичные проблемы после изменений
Если добавить или изменить маршрут, но не обновить кеш, приложение продолжит использовать старую таблицу. Возможны разные симптомы:
- новая страница возвращает ошибку 404, хотя код уже развёрнут;
- старый адрес продолжает отвечать вместо редиректа;
- на разных серверах кластера поведение различается.
Как встроить обновление кеша в процесс выпуска
Очистка и пересоздание кеша маршрутов должны быть обязательным шагом автоматического развёртывания, а не действием, которое помнит только один разработчик. Тогда состояние кеша всегда соответствует выложенному коду.
Правило: после каждого выпуска проверяйте два-три ключевых адреса, среди них один новый и один изменённый.
Не путайте с кешированием страниц
Кеш маршрутов — внутренняя оптимизация приложения. Кеширование самих страниц и заголовков ответа — другая задача, описанная в статье про серверное кеширование.
Кеш и режим разработки
Во время разработки кеш маршрутов обычно отключён, чтобы изменения применялись сразу. Проблемы начинаются, когда кеш включён на тестовом окружении, копирующем боевую конфигурацию. Разработчик меняет маршрут, а результат не видит и ищет ошибку в собственном коде, хотя виноват устаревший кеш.
- явно разделяйте настройки для разработки и рабочего окружения;
- документируйте команду очистки кеша в описании проекта;
- добавьте её в скрипт развёртывания.
Замыкания и невозможность кеширования
Некоторые фреймворки не могут закешировать маршруты, описанные анонимными функциями: такой код нельзя сериализовать. В результате при включении кеша приложение падает с ошибкой. Выносите обработчики в отдельные классы или методы контроллеров, тогда кеширование работает без ограничений.
Несколько серверов и общий кеш
Если приложение работает на нескольких серверах, кеш маршрутов на каждом из них живёт отдельно. При постепенной выкладке часть серверов уже использует новую таблицу, а часть — старую, и пользователи получают разные ответы на один и тот же адрес. Выкладывайте код и обновляйте кеш согласованно, а на время переключения выводите серверы из балансировки.
Частые вопросы
Зачем кешировать список маршрутов?
Чтобы не собирать таблицу адресов заново при каждом запросе, что ускоряет обработку и снижает нагрузку на сервер.
Что происходит, если забыть обновить кеш маршрутов?
Приложение продолжает использовать старую таблицу: новые адреса могут отдавать ошибку, а старые — отвечать по прежней схеме.
Как не забывать обновлять кеш?
Включить очистку и пересоздание кеша в автоматический процесс развёртывания и проверять ключевые адреса после выпуска.
Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.