Есть нагруженный магазин на 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?) кеша. То есть, сделать кеш «вечным», а краулером приводить его в актуальное состояние.
Пока в голову приходит такая картинка:
Как вы решаете подобные вопросы (и с помощью каких технологий)?