shandy
@shandy
CTO at OpsWay

Кеширование Varnish, актуализация (Crowler?) или инвалидация кеша?

Есть нагруженный магазин на Magento (EE)
Есть такая готовая инфраструктура (AWS):
1.1 Nginx — принимает входящие http & https соеденения, направляет трафик на варниш
1.2 Varnish на этом же сервере выступает в роли лоадбалансера + фронтенд кеш
2. Много нод (Apache, PHP) на которых собственно и крутиться Magento
3. Сессии в мемкеше, бекенд кеш — мемкеш + редис (редис отдельный EC2 инстанс, мемкеш — ElastiCache)
4. Админ сервер — выделенная нода для админки — запросы идут на прямую минуя варниш.

Сейчас на этой инфраструктуре работает инвалидация кеша:
На каждый URL (который можно закешировать) бекенд отсылает специальный хедер X-Cache-Tags с перечисление всех тегов для этой страница (например эта страница каталога с 15 продуктами — в хедере будет что-то типа такого: CAT_12, PRO_1, PRO_2 и тд).
Далее, когда мы из админке, например, меняем продукт №1 с тегом PRO_1, то на варниш сервер (асинхронно конечно) будет идти purge (ban) запрос и варниш сбрасывает кеш для этого обьекта (то есть все урлы в котором был хедер X-Cache-Tags с этим значением PRO_1).
Но есть одно «НО».
1-2 раза в день приходиться сбрасывать весь варниш кеш из-за импорта продуктов. И тогда в течении 20-40 минут пользователи проскакивают на бекенд и заполняют 80% кеша. Это приводит к скачкам нагрузки на бекенд, пользователи ждут по 10-30 секунд загрузки страницы, и самое главное оставшиеся 20% это наиболее ресурсоёмкие (время выполнения минуты) не очень часто используемые ресурсы, кешироваться (наполнять кеш) они могут долго (сутки), а тем временем на следующие сутки мы снова сбрасываем весь кеш и весь цикл повторяется снова.

Вот собственно и хочу услышать стоит ли копать в сторону актуализации (Crowler?) кеша. То есть, сделать кеш «вечным», а краулером приводить его в актуальное состояние.
Пока в голову приходит такая картинка:

Как вы решаете подобные вопросы (и с помощью каких технологий)?
  • Вопрос задан
  • 5452 просмотра
Пригласить эксперта
Ответы на вопрос 2
iSage
@iSage
Первое, что приходит в голову — сделать блочное кеширование. Каждому продукту отдельный кеш. Собирать через esi.
Далее, можно добавить кеширование в статику за варнишем. Тем же нгниксом, например. Тогда можно актуализировать этот кеш и уже потом удалять из варниша. Избавит от проблемы, когда клиент спрашивает страницу одновременно с краулером.
Ответ написан
Комментировать
z0rg
@z0rg
senior developer / devops
Собственно вопрос в лоб, почему варниш не стоит на первом месте у вас? По такой схеме он должен стоять на фронте и уже все остальное не нужное ему отдавать nginx'у.
Есть модуль от Turpentine для varnish для генерации блоков через esi.
Все исключения прописываются в админке для этого модуля, модуль генерирует новый конфиг и отдаем напрямую в варниш, а так же сохраняет в файл.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы