Создать URL
Генератор Правила транслитерации Как сделать ЧПУ Блог Вопросы и ответы Создать URL
Разработка

Кеширование маршрутов и его подводные камни

Развивая тему маршрутизации, поговорим об оптимизации, которая при неосторожном использовании сама становится источником ошибок.

Что именно кешируется

Фреймворки при запуске обходят все файлы с описанием маршрутов и строят таблицу соответствия адресов обработчикам. На большом проекте это занимает заметное время, поэтому результат сохраняют в кеш и при каждом запросе читают готовую таблицу.

Что это даёт

  • ускоряется обработка каждого запроса;
  • снижается нагрузка на процессор сервера;
  • сокращается время до первого байта, что полезно и роботу.

Типичные проблемы после изменений

Если добавить или изменить маршрут, но не обновить кеш, приложение продолжит использовать старую таблицу. Возможны разные симптомы:

  • новая страница возвращает ошибку 404, хотя код уже развёрнут;
  • старый адрес продолжает отвечать вместо редиректа;
  • на разных серверах кластера поведение различается.

Как встроить обновление кеша в процесс выпуска

Очистка и пересоздание кеша маршрутов должны быть обязательным шагом автоматического развёртывания, а не действием, которое помнит только один разработчик. Тогда состояние кеша всегда соответствует выложенному коду.

Правило: после каждого выпуска проверяйте два-три ключевых адреса, среди них один новый и один изменённый.

Не путайте с кешированием страниц

Кеш маршрутов — внутренняя оптимизация приложения. Кеширование самих страниц и заголовков ответа — другая задача, описанная в статье про серверное кеширование.

Кеш и режим разработки

Во время разработки кеш маршрутов обычно отключён, чтобы изменения применялись сразу. Проблемы начинаются, когда кеш включён на тестовом окружении, копирующем боевую конфигурацию. Разработчик меняет маршрут, а результат не видит и ищет ошибку в собственном коде, хотя виноват устаревший кеш.

  • явно разделяйте настройки для разработки и рабочего окружения;
  • документируйте команду очистки кеша в описании проекта;
  • добавьте её в скрипт развёртывания.

Замыкания и невозможность кеширования

Некоторые фреймворки не могут закешировать маршруты, описанные анонимными функциями: такой код нельзя сериализовать. В результате при включении кеша приложение падает с ошибкой. Выносите обработчики в отдельные классы или методы контроллеров, тогда кеширование работает без ограничений.

Несколько серверов и общий кеш

Если приложение работает на нескольких серверах, кеш маршрутов на каждом из них живёт отдельно. При постепенной выкладке часть серверов уже использует новую таблицу, а часть — старую, и пользователи получают разные ответы на один и тот же адрес. Выкладывайте код и обновляйте кеш согласованно, а на время переключения выводите серверы из балансировки.

Частые вопросы

Зачем кешировать список маршрутов?

Чтобы не собирать таблицу адресов заново при каждом запросе, что ускоряет обработку и снижает нагрузку на сервер.

Что происходит, если забыть обновить кеш маршрутов?

Приложение продолжает использовать старую таблицу: новые адреса могут отдавать ошибку, а старые — отвечать по прежней схеме.

Как не забывать обновлять кеш?

Включить очистку и пересоздание кеша в автоматический процесс развёртывания и проверять ключевые адреса после выпуска.

Готовый адрес можно собрать прямо сейчас: откройте генератор ЧПУ — он транслитерирует фразу по таблице Яндекса, уберёт служебные слова и покажет длину адреса.

Читайте также