SlideShare una empresa de Scribd logo
1 de 54
Descargar para leer sin conexión
Кэширование
в веб-приложениях:
что? где? когда?
Виталий Филиппов
Ведущий веб-разработчик
16 мая 2013 года
Кто я?
 В CUSTIS – ведущий веб-разработчик
 Мои доклады и контакты:
http://yourcmc.ru/wiki/User:VitaliyFilippov
 Поддерживаю сборку Mediawiki4Intranet
 («И давно вы страдаете программизмом?»)
 Кодинг лет с 11 :)
 Linux’оид ± веб-разработчик то ли с 16, то ли с 17
[сайтиков понаписал]
 Языки: в основном PHP, Perl, Python
 Win&Mac must die! Only GPL! Only Free Software!
Only hardcore :)
 Адрес этого доклада:
http://lib.custis.ru/WebAppCaching
2/54
О чем доклад?!
 Веб-приложения
 Кэширование
 Где? Внешний кэш vs память процесса
 Как надо? Инвалидация
 Оценка эффективности
 Как НЕ надо? Фейлы
 Client-side кэширование (HTTP)
 Приёмы server-side кэширования
 Дополнительные меры
3/54
Веб-приложения
4/54
Веб-приложение ≈ примерно САЙТ!
 Сетевое, клиент-серверное
 Открытые стандарты, протокол HTTP
На клиенте (клиент = браузер):
 Основное: HTML + CSS + JavaScript
На сервере:
 Очень популярен LAMP
 Разное
5/54
Схема веб-приложения
6/54
Кэши есть везде!
7/54
Кэширование
8/54
Кэширование
Обмен вычислений на память!
(То есть сохранение и повторное использование чего-нибудь)
Кэшировать можно почти все что угодно –
данные, код, соединения, адреса…
9/54
Кэш vs БД
База заранее вычисленных данных – не кэш!
Ибо:
 Кэш обычно строится на лету, динамически
 Записи в кэше обычно непостоянны
(с этим связан Fail №1 – использование кэша как БД)
 Обычно есть вытеснение: LRU / FIFO / прочие
Например, memcached – кэш, а Redis – БД.
10/54
Где кэшировать данные?
 Внешний кэш + сериализация
PHP – без вариантов, только внешний
 Память процесса
Управляемая?
Неуправляемая?
 Распределенный кэш
11/54
Больше проблем, чем плюсов  Самая главная –
 Такой кэш не масштабируется!
Управляемая память:
 Накладные расходы = 0, объект живой
 Живые объекты – толстые
 Может прийти GC (Garbage Collector, сборщик мусора)
Неуправляемая / разделяемая
(например, так делают Одноклассники):
 Те же накладные расходы на сериализацию
Память процесса
12/54
Внешний кэш
Просто и популярно — memcached ± redis
 Может быть разделяемый, распределённый
 Накладные расходы на сериализацию и сеть
 Локально используйте UNIX-сокеты
 PHP: ставьте igbinary
 Java, C++, Python: protobuf от Google
13/54
Consistent hashing
Для быстрого добавления/удаления узлов
14/54
А если данные меняются?..
15/54
Инвалидация кэша
⇒ Кэш нужно обновлять (сбрасывать)
Простейшие варианты:
 Не сбрасывать вообще
(только добавление)
 Сбрасывать по ключу
(если нет зависимостей)
 Сбрасывать ВСЁ
(если меняется всё 1 раз в день)
16/54
Инвалидация
А если у объектов сложные зависимости?
17/54
По времени (TTL)
 Просто, но не оперативно 
 Удаление через заданное время жизни (TTL)
 TTL без поддержки TTL:
при чтении сверять срок годности
 Микрокэширование: TTL = 1 секунда
18/54
Наиболее гибко – по тегам
 Тег = зависимость
 На элементы кэша ставятся теги
 Сброс всех ключей по тегу =
обновление зависимости
 Иерархия: если тег сам зависит
от других
19/54
Теги без поддержки тегов
Списочный метод:
 Хранить списки ключей для каждого тега
 Медленный сброс
Версионный метод :
 Сброс = инкремент версии тега
 При чтении сверяем версию
Но: нужен Redis!
20/54
Оценка эффективности кэша
Главное – выигрыш в производительности
 Профилирование С кэшем и БЕЗ кэша
 Hit / Miss (попадания / промахи)
Низкие hit: горячие / взрыв / дублирование / размер
 Размер кэша, количество вытеснений
21/54
Типичные фейлы
(Антипаттерны кэширования)
Слишком мало Слишком много
22/54
Fail № 1
«Положил и точно заберу»
Например, сессии в memcached
23/54
Fail № 2
Кэширование авторизованных страниц
Или одного и того же списка с выбранным
элементом
(итог – комбинаторный взрыв)
24/54
Fail № 3
Аппарат искусственного дыхания
Будет очень грустно его отключать
(сбрасывать кэш)
25/54
Fail № 4
Cache hit под 100 %, а всё тормозит!
Кэшировали яро, но не то, что надо
26/54
Заключеньице
 Кэш – не БД!
 Обычно внешний кэш лучше
(масштабируется)
 Обычно полезны теги
 Всегда нужна оценка работы кэша
27/54
Клиентское кэширование
28/54
HTTP
 Простой текстовый протокол
 Почти Stateless (почти REST)
 Keepalive – кэш соединений
Запрос Ответ
МЕТОД /адрес/?параметры HTTP/1.1
Host: домен.сайта
Заголовок: Значение
Тело запроса (при загрузке файлов)
HTTP/1.1 000=код_статуса Статус
Ответа
Content-Type: text/html;
charset=UTF-8 Заголовок: Значение
Тело запроса (текст страницы)
29/54
Блин! Что еще за кэш?
google://php отключить кэш
 Как отключить кэширование на PHP –
Создание и Продвижение Сайтов
 Запрет кэширования посредством PHP –
Справочник веб-языков
 Записки программиста PHP –
Как отключить кэширование страниц
 100%-ное отключение кэширования –
Форум програмистов
 How to Remove Cache in PHP | eHow
 …
30/54
Пацаны, у меня фаервол
Cache-Control: no-cache,
no-store, must-revalidate,
max-age=0
Pragma: no-cache
Vary: *
Expires: Thu, 01 Jan 1970
00:00:00 GMT
31/54
32/54
HTTP-кэш любят все
 Браузеры – быстрее открывают страницу
(повторно, «Назад»)
 Поисковики – быстрее индексируют
 Прокси – лучше работают
 А нагрузка – снижается…
Защита от умника с кнопкой F5
33/54
HTTP-кэш
 Браузеры / прокси могут
сохранять HTTP-ответы
 Есть статус ответа
HTTP 304 Not Modified
 Есть заголовки для
управления кэшированием
Причём частично
в довольно диких комбинациях
 Куча костылей для проксей
34/54
HTTP-кэш: схема
35/54
Управление HTTP-кэшированием
HTTP 1.0 (по времени):
 Last-Modified, If-Modified-Since
 Expires, Pragma: no-cache
HTTP 1.1 (по времени и значениям):
 ETag, If-None-Match
 Vary
 Cache-Control
36/54
Cache-Control
 no-cache (запрет кэширования)
 must-revalidate (костыль)
 private, public (личное / публичное)
 срок кэширования: max-age, s-maxage
(для прокси)
(осторожно!)
37/54
В Cache-Control…
…есть странные опции
38/54
Странные опции
 no-transform
 no-store (отвернись и не смотри)
 proxy-revalidate, community=…
 в запросе: max-age, only-if-cached, min-
fresh, max-stale
39/54
Long Poll
(как пример кэша соединений)
Задача: твиттер / вконтактик,
показывать новых котиков в реальном времени.
При ожидании ответа сервер подвешивает
соединение клиента на N секунд.
40/54
Заключение
Для содержимого достаточно отслеживать
даты изменений:
 no-cache + Last-Modified: ...
 304 Not Modified + Date: ...
Для статики:
 Большой max-age
41/54
Кэш приложения
(основное, на что мы можем повлиять!)
42/54
Что кэшировать?
Как можно бОльшие куски информации:
 страницы (если можно; обычно – нельзя)
 → блоки (побить на них всю страницу;
обычно – можно)
 → выборки (только тяжелые)
 → объекты (только очень тяжелые)
43/54
Приёмы
Что делать с макаронами? [плохим кодом]
44/54
MVC
 Нет понятия «объект»? ⇒ Модель
 Не можем кэшировать шаблоны, так как
непонятно, где шаблоны? ⇒ View
45/54
Побочные эффекты?
⇒ Инкапсулировать их в Stash
46/54
Lambda-Walk
по связанным объектам?
 Либо M-V-Presenter
 Либо массовая автозагрузка
47/54
Шаблон читает из БД…
…как кэшировать?
⇒ Кэшировать после шаблона
48/54
HMVC
49/54
Иерархический MVC
 Блочная структура естественна
 Удобно кэшировать!
 Юзают авторы поделия под названием
Kohana Framework
 Однако они о кэшировании НЕ ЗНАЮТ! :D
и поэтому его там правильного нет
50/54
На что ещё можно влиять
Веб – не низкий уровень, до кэша CPU
не спустишься :)
 Кэш ЯП — заюзать (PHP: APC/XCache,
остальные: предзагрузка)
 Правильный сериализатор – поставить
 Кэш СУБД
JavaScript:
 Поменьше фреймворков
 Писать ручками в прототипах :)
 Обработчики inline
51/54
Кэш СУБД — примеры
MySQL:
 Запросы: query-cache-limit, query-cache-size
 Таблицы: table-open-cache, table-definition-cache
 Дисковый: innodb-buffer-pool-size
 Бинлог: binlog-cache-size
 Потоки: thread-cache-size
PostgreSQL:
 Дисковый: shared_buffers
 Остальное (планы, таблицы): work_mem
 Размер кэша ОС: effective_cache_size
52/54
Резюмируем
 Стараться кэшировать целые страницы
 HMVC
 memcached, redis
 Теги, Last-Modified
 PHP: обязательны APC/XCache, igbinary
 Тюнить кэш СУБД
 Поменьше фреймворков, побольше разума
53/54
 http://lib.custis.ru/WebAppCaching
 vfilippov d0g custis d0t ru
vitalif d0g mail d0t ru
54/54

Más contenido relacionado

La actualidad más candente

Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Ontico
 
Фронтенд разработка без боли
Фронтенд разработка без болиФронтенд разработка без боли
Фронтенд разработка без болиAnton Piskunov
 
Сборка проектов с помощью ENB
Сборка проектов с помощью ENBСборка проектов с помощью ENB
Сборка проектов с помощью ENBAleksandr Boichenko
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...corehard_by
 
Полный цикл разработки на Python + Django
Полный цикл разработки на Python + DjangoПолный цикл разработки на Python + Django
Полный цикл разработки на Python + DjangoAzamat Tokhtaev
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковAlex Tumanoff
 
Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.Vladimir Malyk
 
Обзор Haxe & OpenFl
Обзор Haxe & OpenFlОбзор Haxe & OpenFl
Обзор Haxe & OpenFlDevOWL Meetup
 
Performance engineering stories from #fdminicon Saransk
Performance engineering stories from #fdminicon SaranskPerformance engineering stories from #fdminicon Saransk
Performance engineering stories from #fdminicon SaranskAlex Chistyakov
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NETlugnsk
 
My talk on administering PostgreSQL
My talk on administering PostgreSQLMy talk on administering PostgreSQL
My talk on administering PostgreSQLAlex Chistyakov
 
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...Ontico
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Alexey Kachayev
 
История развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другиеИстория развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другиеlugnsk
 
Применение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахПрименение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахAlex Chistyakov
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Ontico
 
Headless Drupal на примере Drupal 8 и React
Headless Drupal на примере Drupal 8 и ReactHeadless Drupal на примере Drupal 8 и React
Headless Drupal на примере Drupal 8 и ReactDrupalSPB
 
Кроссплатформенная разработка на Haxe
Кроссплатформенная разработка на HaxeКроссплатформенная разработка на Haxe
Кроссплатформенная разработка на HaxeEugene Veretennikov
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковCodeFest
 

La actualidad más candente (20)

Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)Pconnect: граната в руках обезьяны (Сергей Аверин)
Pconnect: граната в руках обезьяны (Сергей Аверин)
 
Фронтенд разработка без боли
Фронтенд разработка без болиФронтенд разработка без боли
Фронтенд разработка без боли
 
Сборка проектов с помощью ENB
Сборка проектов с помощью ENBСборка проектов с помощью ENB
Сборка проектов с помощью ENB
 
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
C++ CoreHard Autumn 2018. Ускорение сборки C++ проектов, способы и последстви...
 
Полный цикл разработки на Python + Django
Полный цикл разработки на Python + DjangoПолный цикл разработки на Python + Django
Полный цикл разработки на Python + Django
 
Какой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис ЦыплаковКакой фреймворк нам нужен для Web? Денис Цыплаков
Какой фреймворк нам нужен для Web? Денис Цыплаков
 
Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.Современный фронтенд за 30 минут.
Современный фронтенд за 30 минут.
 
Обзор Haxe & OpenFl
Обзор Haxe & OpenFlОбзор Haxe & OpenFl
Обзор Haxe & OpenFl
 
Performance engineering stories from #fdminicon Saransk
Performance engineering stories from #fdminicon SaranskPerformance engineering stories from #fdminicon Saransk
Performance engineering stories from #fdminicon Saransk
 
Opensource на .NET
Opensource на .NETOpensource на .NET
Opensource на .NET
 
My talk on administering PostgreSQL
My talk on administering PostgreSQLMy talk on administering PostgreSQL
My talk on administering PostgreSQL
 
Vagrant puppet
Vagrant puppetVagrant puppet
Vagrant puppet
 
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...
Куда катится PHP, а также про Yii и другие фреймворки / Александр Макаров (St...
 
Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)Воюем за ресурсы (ZFConf2011)
Воюем за ресурсы (ZFConf2011)
 
История развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другиеИстория развития и применения CMS: Drupal и другие
История развития и применения CMS: Drupal и другие
 
Применение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектахПрименение языка Go в инфраструктурных проектах
Применение языка Go в инфраструктурных проектах
 
Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)Конструктор / Денис Паясь (Яндекс)
Конструктор / Денис Паясь (Яндекс)
 
Headless Drupal на примере Drupal 8 и React
Headless Drupal на примере Drupal 8 и ReactHeadless Drupal на примере Drupal 8 и React
Headless Drupal на примере Drupal 8 и React
 
Кроссплатформенная разработка на Haxe
Кроссплатформенная разработка на HaxeКроссплатформенная разработка на Haxe
Кроссплатформенная разработка на Haxe
 
Frontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиковFrontend: Путешествие в мир модульных загрузчиков
Frontend: Путешествие в мир модульных загрузчиков
 

Similar a Кэширование в веб-приложениях: что? где? когда?

Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)Sergey Skvortsov
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаRoman Dvornov
 
Обзор Continuous integration инструментов
Обзор Continuous integration инструментовОбзор Continuous integration инструментов
Обзор Continuous integration инструментовVitalii Morvaniuk
 
Highload2009 Rybak Badoo Os
Highload2009 Rybak Badoo OsHighload2009 Rybak Badoo Os
Highload2009 Rybak Badoo OsHighLoad2009
 
Пост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеПост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеbeched
 
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...Egor Konovalov
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerLEDC 2016
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4HighLoad2009
 
HappyDev`12 - Александр Чистяков - Большой веб-проект: развитие, рост, пробле...
HappyDev`12 - Александр Чистяков - Большой веб-проект: развитие, рост, пробле...HappyDev`12 - Александр Чистяков - Большой веб-проект: развитие, рост, пробле...
HappyDev`12 - Александр Чистяков - Большой веб-проект: развитие, рост, пробле...etarasenko
 
Big web project @happydev Omsk
Big web project @happydev OmskBig web project @happydev Omsk
Big web project @happydev OmskAlex Chistyakov
 
Александр Чистяков - Большой веб-проект: развитие, рост, проблемы, решения с ...
Александр Чистяков - Большой веб-проект: развитие, рост, проблемы, решения с ...Александр Чистяков - Большой веб-проект: развитие, рост, проблемы, решения с ...
Александр Чистяков - Большой веб-проект: развитие, рост, проблемы, решения с ...HappyDev
 
Software craftsmanship 12 online highload systems
Software craftsmanship 12 online highload systemsSoftware craftsmanship 12 online highload systems
Software craftsmanship 12 online highload systemsPavel Veinik
 
Drupal 8: Теперь со вкусом Symfony
Drupal 8: Теперь со вкусом SymfonyDrupal 8: Теперь со вкусом Symfony
Drupal 8: Теперь со вкусом SymfonyKate Marshalkina
 
Мульти-блиц выступление на Стачка-2012
Мульти-блиц выступление на Стачка-2012Мульти-блиц выступление на Стачка-2012
Мульти-блиц выступление на Стачка-2012Alexey Mahotkin
 
Pconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяныPconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяныSergey Xek
 
Ошибки в разработке интернет-магазинов - Евгений Концевой
Ошибки в разработке интернет-магазинов - Евгений КонцевойОшибки в разработке интернет-магазинов - Евгений Концевой
Ошибки в разработке интернет-магазинов - Евгений КонцевойЛеонид Гроховский
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultOleg Mykolaichenko
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняLuxoftTraining
 

Similar a Кэширование в веб-приложениях: что? где? когда? (20)

Catalyst – MVC framework на Perl (RIT 2008)
Catalyst – MVC framework на Perl  (RIT 2008)Catalyst – MVC framework на Perl  (RIT 2008)
Catalyst – MVC framework на Perl (RIT 2008)
 
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
CodeFest 2014. Каплуновский Б. — Использование асинхронного I/O для снижения ...
 
Масштабируемая архитектура фронтенда
Масштабируемая архитектура фронтендаМасштабируемая архитектура фронтенда
Масштабируемая архитектура фронтенда
 
Обзор Continuous integration инструментов
Обзор Continuous integration инструментовОбзор Continuous integration инструментов
Обзор Continuous integration инструментов
 
Highload2009 Rybak Badoo Os
Highload2009 Rybak Badoo OsHighload2009 Rybak Badoo Os
Highload2009 Rybak Badoo Os
 
Пост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновениеПост-эксплуатация веб-приложений в тестах на проникновение
Пост-эксплуатация веб-приложений в тестах на проникновение
 
Node.js (RichClient)
 Node.js (RichClient) Node.js (RichClient)
Node.js (RichClient)
 
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
Как сделать проект с 1 500 000 просмотров в сутки, который не ломается - IzhD...
 
Ігор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developerІгор Карпиленко — PHPStorm for drupal developer
Ігор Карпиленко — PHPStorm for drupal developer
 
Dz Java Hi Load 0.4
Dz Java Hi Load 0.4Dz Java Hi Load 0.4
Dz Java Hi Load 0.4
 
HappyDev`12 - Александр Чистяков - Большой веб-проект: развитие, рост, пробле...
HappyDev`12 - Александр Чистяков - Большой веб-проект: развитие, рост, пробле...HappyDev`12 - Александр Чистяков - Большой веб-проект: развитие, рост, пробле...
HappyDev`12 - Александр Чистяков - Большой веб-проект: развитие, рост, пробле...
 
Big web project @happydev Omsk
Big web project @happydev OmskBig web project @happydev Omsk
Big web project @happydev Omsk
 
Александр Чистяков - Большой веб-проект: развитие, рост, проблемы, решения с ...
Александр Чистяков - Большой веб-проект: развитие, рост, проблемы, решения с ...Александр Чистяков - Большой веб-проект: развитие, рост, проблемы, решения с ...
Александр Чистяков - Большой веб-проект: развитие, рост, проблемы, решения с ...
 
Software craftsmanship 12 online highload systems
Software craftsmanship 12 online highload systemsSoftware craftsmanship 12 online highload systems
Software craftsmanship 12 online highload systems
 
Drupal 8: Теперь со вкусом Symfony
Drupal 8: Теперь со вкусом SymfonyDrupal 8: Теперь со вкусом Symfony
Drupal 8: Теперь со вкусом Symfony
 
Мульти-блиц выступление на Стачка-2012
Мульти-блиц выступление на Стачка-2012Мульти-блиц выступление на Стачка-2012
Мульти-блиц выступление на Стачка-2012
 
Pconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяныPconnect: граната в руках обезьяны
Pconnect: граната в руках обезьяны
 
Ошибки в разработке интернет-магазинов - Евгений Концевой
Ошибки в разработке интернет-магазинов - Евгений КонцевойОшибки в разработке интернет-магазинов - Евгений Концевой
Ошибки в разработке интернет-магазинов - Евгений Концевой
 
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp VaultКак перестать хранить секреты в git и начать использовать Hashicorp Vault
Как перестать хранить секреты в git и начать использовать Hashicorp Vault
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровня
 

Más de CUSTIS

Три истории микросервисов, или MSA для Enterprise
Три истории микросервисов, или MSA для EnterpriseТри истории микросервисов, или MSA для Enterprise
Три истории микросервисов, или MSA для EnterpriseCUSTIS
 
Долгоживущие ИТ в динамичном ритейле
Долгоживущие ИТ в динамичном ритейлеДолгоживущие ИТ в динамичном ритейле
Долгоживущие ИТ в динамичном ритейлеCUSTIS
 
Будущее уже наступило: от Agile к бирюзовым организациям
Будущее уже наступило: от Agile к бирюзовым организациямБудущее уже наступило: от Agile к бирюзовым организациям
Будущее уже наступило: от Agile к бирюзовым организациямCUSTIS
 
Как выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиямиКак выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиямиCUSTIS
 
Диаграммы учета как средство для наглядного и целостного отображения правил у...
Диаграммы учета как средство для наглядного и целостного отображения правил у...Диаграммы учета как средство для наглядного и целостного отображения правил у...
Диаграммы учета как средство для наглядного и целостного отображения правил у...CUSTIS
 
Сотрудничество с корпорациями: рецепты из практики
Сотрудничество с корпорациями: рецепты из практикиСотрудничество с корпорациями: рецепты из практики
Сотрудничество с корпорациями: рецепты из практикиCUSTIS
 
Agile — ответ на вызовы третьей промышленной революции
Agile — ответ на вызовы третьей промышленной революцииAgile — ответ на вызовы третьей промышленной революции
Agile — ответ на вызовы третьей промышленной революцииCUSTIS
 
Опыт построения микросервисной архитектуры в цифровом банке
Опыт построения микросервисной архитектуры в цифровом банкеОпыт построения микросервисной архитектуры в цифровом банке
Опыт построения микросервисной архитектуры в цифровом банкеCUSTIS
 
Золотая лихорадка MSA: почему нам не подошли микросервисы?
Золотая лихорадка MSA: почему нам не подошли микросервисы?Золотая лихорадка MSA: почему нам не подошли микросервисы?
Золотая лихорадка MSA: почему нам не подошли микросервисы?CUSTIS
 
Барьеры микросервисной архитектуры
Барьеры микросервисной архитектурыБарьеры микросервисной архитектуры
Барьеры микросервисной архитектурыCUSTIS
 
Три истории микросервисов
Три истории микросервисовТри истории микросервисов
Три истории микросервисовCUSTIS
 
От монолитных моделей предметной области — к модульным
От монолитных моделей предметной области — к модульнымОт монолитных моделей предметной области — к модульным
От монолитных моделей предметной области — к модульнымCUSTIS
 
Проблемы управления правами доступа к информационным системам крупной торгово...
Проблемы управления правами доступа к информационным системам крупной торгово...Проблемы управления правами доступа к информационным системам крупной торгово...
Проблемы управления правами доступа к информационным системам крупной торгово...CUSTIS
 
Будущее omni-channel маркетинга: инструменты, кейсы и цифры
Будущее omni-channel маркетинга: инструменты, кейсы и цифрыБудущее omni-channel маркетинга: инструменты, кейсы и цифры
Будущее omni-channel маркетинга: инструменты, кейсы и цифрыCUSTIS
 
Agile и управление знаниями в ИТ-проектах
Agile и управление знаниями в ИТ-проектахAgile и управление знаниями в ИТ-проектах
Agile и управление знаниями в ИТ-проектахCUSTIS
 
State of the .Net Performance
State of the .Net PerformanceState of the .Net Performance
State of the .Net PerformanceCUSTIS
 
Ответственность за качество в разных ИТ-проектах: в чем она и как ее разделять
Ответственность за качество в разных ИТ-проектах: в чем она и как ее разделятьОтветственность за качество в разных ИТ-проектах: в чем она и как ее разделять
Ответственность за качество в разных ИТ-проектах: в чем она и как ее разделятьCUSTIS
 
Опыт применения метода ATAM для оценки архитектуры
Опыт применения метода ATAM для оценки архитектурыОпыт применения метода ATAM для оценки архитектуры
Опыт применения метода ATAM для оценки архитектурыCUSTIS
 
Гибридный подход к управлению правами доступа: когда стандартного IDM не хватает
Гибридный подход к управлению правами доступа: когда стандартного IDM не хватаетГибридный подход к управлению правами доступа: когда стандартного IDM не хватает
Гибридный подход к управлению правами доступа: когда стандартного IDM не хватаетCUSTIS
 
Собираем кубик Рубика: восстановление архитектурного описания корпоративной р...
Собираем кубик Рубика: восстановление архитектурного описания корпоративной р...Собираем кубик Рубика: восстановление архитектурного описания корпоративной р...
Собираем кубик Рубика: восстановление архитектурного описания корпоративной р...CUSTIS
 

Más de CUSTIS (20)

Три истории микросервисов, или MSA для Enterprise
Три истории микросервисов, или MSA для EnterpriseТри истории микросервисов, или MSA для Enterprise
Три истории микросервисов, или MSA для Enterprise
 
Долгоживущие ИТ в динамичном ритейле
Долгоживущие ИТ в динамичном ритейлеДолгоживущие ИТ в динамичном ритейле
Долгоживущие ИТ в динамичном ритейле
 
Будущее уже наступило: от Agile к бирюзовым организациям
Будущее уже наступило: от Agile к бирюзовым организациямБудущее уже наступило: от Agile к бирюзовым организациям
Будущее уже наступило: от Agile к бирюзовым организациям
 
Как выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиямиКак выбрать для проекта практики проектирования и работы с требованиями
Как выбрать для проекта практики проектирования и работы с требованиями
 
Диаграммы учета как средство для наглядного и целостного отображения правил у...
Диаграммы учета как средство для наглядного и целостного отображения правил у...Диаграммы учета как средство для наглядного и целостного отображения правил у...
Диаграммы учета как средство для наглядного и целостного отображения правил у...
 
Сотрудничество с корпорациями: рецепты из практики
Сотрудничество с корпорациями: рецепты из практикиСотрудничество с корпорациями: рецепты из практики
Сотрудничество с корпорациями: рецепты из практики
 
Agile — ответ на вызовы третьей промышленной революции
Agile — ответ на вызовы третьей промышленной революцииAgile — ответ на вызовы третьей промышленной революции
Agile — ответ на вызовы третьей промышленной революции
 
Опыт построения микросервисной архитектуры в цифровом банке
Опыт построения микросервисной архитектуры в цифровом банкеОпыт построения микросервисной архитектуры в цифровом банке
Опыт построения микросервисной архитектуры в цифровом банке
 
Золотая лихорадка MSA: почему нам не подошли микросервисы?
Золотая лихорадка MSA: почему нам не подошли микросервисы?Золотая лихорадка MSA: почему нам не подошли микросервисы?
Золотая лихорадка MSA: почему нам не подошли микросервисы?
 
Барьеры микросервисной архитектуры
Барьеры микросервисной архитектурыБарьеры микросервисной архитектуры
Барьеры микросервисной архитектуры
 
Три истории микросервисов
Три истории микросервисовТри истории микросервисов
Три истории микросервисов
 
От монолитных моделей предметной области — к модульным
От монолитных моделей предметной области — к модульнымОт монолитных моделей предметной области — к модульным
От монолитных моделей предметной области — к модульным
 
Проблемы управления правами доступа к информационным системам крупной торгово...
Проблемы управления правами доступа к информационным системам крупной торгово...Проблемы управления правами доступа к информационным системам крупной торгово...
Проблемы управления правами доступа к информационным системам крупной торгово...
 
Будущее omni-channel маркетинга: инструменты, кейсы и цифры
Будущее omni-channel маркетинга: инструменты, кейсы и цифрыБудущее omni-channel маркетинга: инструменты, кейсы и цифры
Будущее omni-channel маркетинга: инструменты, кейсы и цифры
 
Agile и управление знаниями в ИТ-проектах
Agile и управление знаниями в ИТ-проектахAgile и управление знаниями в ИТ-проектах
Agile и управление знаниями в ИТ-проектах
 
State of the .Net Performance
State of the .Net PerformanceState of the .Net Performance
State of the .Net Performance
 
Ответственность за качество в разных ИТ-проектах: в чем она и как ее разделять
Ответственность за качество в разных ИТ-проектах: в чем она и как ее разделятьОтветственность за качество в разных ИТ-проектах: в чем она и как ее разделять
Ответственность за качество в разных ИТ-проектах: в чем она и как ее разделять
 
Опыт применения метода ATAM для оценки архитектуры
Опыт применения метода ATAM для оценки архитектурыОпыт применения метода ATAM для оценки архитектуры
Опыт применения метода ATAM для оценки архитектуры
 
Гибридный подход к управлению правами доступа: когда стандартного IDM не хватает
Гибридный подход к управлению правами доступа: когда стандартного IDM не хватаетГибридный подход к управлению правами доступа: когда стандартного IDM не хватает
Гибридный подход к управлению правами доступа: когда стандартного IDM не хватает
 
Собираем кубик Рубика: восстановление архитектурного описания корпоративной р...
Собираем кубик Рубика: восстановление архитектурного описания корпоративной р...Собираем кубик Рубика: восстановление архитектурного описания корпоративной р...
Собираем кубик Рубика: восстановление архитектурного описания корпоративной р...
 

Кэширование в веб-приложениях: что? где? когда?

  • 1. Кэширование в веб-приложениях: что? где? когда? Виталий Филиппов Ведущий веб-разработчик 16 мая 2013 года
  • 2. Кто я?  В CUSTIS – ведущий веб-разработчик  Мои доклады и контакты: http://yourcmc.ru/wiki/User:VitaliyFilippov  Поддерживаю сборку Mediawiki4Intranet  («И давно вы страдаете программизмом?»)  Кодинг лет с 11 :)  Linux’оид ± веб-разработчик то ли с 16, то ли с 17 [сайтиков понаписал]  Языки: в основном PHP, Perl, Python  Win&Mac must die! Only GPL! Only Free Software! Only hardcore :)  Адрес этого доклада: http://lib.custis.ru/WebAppCaching 2/54
  • 3. О чем доклад?!  Веб-приложения  Кэширование  Где? Внешний кэш vs память процесса  Как надо? Инвалидация  Оценка эффективности  Как НЕ надо? Фейлы  Client-side кэширование (HTTP)  Приёмы server-side кэширования  Дополнительные меры 3/54
  • 5. Веб-приложение ≈ примерно САЙТ!  Сетевое, клиент-серверное  Открытые стандарты, протокол HTTP На клиенте (клиент = браузер):  Основное: HTML + CSS + JavaScript На сервере:  Очень популярен LAMP  Разное 5/54
  • 9. Кэширование Обмен вычислений на память! (То есть сохранение и повторное использование чего-нибудь) Кэшировать можно почти все что угодно – данные, код, соединения, адреса… 9/54
  • 10. Кэш vs БД База заранее вычисленных данных – не кэш! Ибо:  Кэш обычно строится на лету, динамически  Записи в кэше обычно непостоянны (с этим связан Fail №1 – использование кэша как БД)  Обычно есть вытеснение: LRU / FIFO / прочие Например, memcached – кэш, а Redis – БД. 10/54
  • 11. Где кэшировать данные?  Внешний кэш + сериализация PHP – без вариантов, только внешний  Память процесса Управляемая? Неуправляемая?  Распределенный кэш 11/54
  • 12. Больше проблем, чем плюсов  Самая главная –  Такой кэш не масштабируется! Управляемая память:  Накладные расходы = 0, объект живой  Живые объекты – толстые  Может прийти GC (Garbage Collector, сборщик мусора) Неуправляемая / разделяемая (например, так делают Одноклассники):  Те же накладные расходы на сериализацию Память процесса 12/54
  • 13. Внешний кэш Просто и популярно — memcached ± redis  Может быть разделяемый, распределённый  Накладные расходы на сериализацию и сеть  Локально используйте UNIX-сокеты  PHP: ставьте igbinary  Java, C++, Python: protobuf от Google 13/54
  • 14. Consistent hashing Для быстрого добавления/удаления узлов 14/54
  • 15. А если данные меняются?.. 15/54
  • 16. Инвалидация кэша ⇒ Кэш нужно обновлять (сбрасывать) Простейшие варианты:  Не сбрасывать вообще (только добавление)  Сбрасывать по ключу (если нет зависимостей)  Сбрасывать ВСЁ (если меняется всё 1 раз в день) 16/54
  • 17. Инвалидация А если у объектов сложные зависимости? 17/54
  • 18. По времени (TTL)  Просто, но не оперативно   Удаление через заданное время жизни (TTL)  TTL без поддержки TTL: при чтении сверять срок годности  Микрокэширование: TTL = 1 секунда 18/54
  • 19. Наиболее гибко – по тегам  Тег = зависимость  На элементы кэша ставятся теги  Сброс всех ключей по тегу = обновление зависимости  Иерархия: если тег сам зависит от других 19/54
  • 20. Теги без поддержки тегов Списочный метод:  Хранить списки ключей для каждого тега  Медленный сброс Версионный метод :  Сброс = инкремент версии тега  При чтении сверяем версию Но: нужен Redis! 20/54
  • 21. Оценка эффективности кэша Главное – выигрыш в производительности  Профилирование С кэшем и БЕЗ кэша  Hit / Miss (попадания / промахи) Низкие hit: горячие / взрыв / дублирование / размер  Размер кэша, количество вытеснений 21/54
  • 23. Fail № 1 «Положил и точно заберу» Например, сессии в memcached 23/54
  • 24. Fail № 2 Кэширование авторизованных страниц Или одного и того же списка с выбранным элементом (итог – комбинаторный взрыв) 24/54
  • 25. Fail № 3 Аппарат искусственного дыхания Будет очень грустно его отключать (сбрасывать кэш) 25/54
  • 26. Fail № 4 Cache hit под 100 %, а всё тормозит! Кэшировали яро, но не то, что надо 26/54
  • 27. Заключеньице  Кэш – не БД!  Обычно внешний кэш лучше (масштабируется)  Обычно полезны теги  Всегда нужна оценка работы кэша 27/54
  • 29. HTTP  Простой текстовый протокол  Почти Stateless (почти REST)  Keepalive – кэш соединений Запрос Ответ МЕТОД /адрес/?параметры HTTP/1.1 Host: домен.сайта Заголовок: Значение Тело запроса (при загрузке файлов) HTTP/1.1 000=код_статуса Статус Ответа Content-Type: text/html; charset=UTF-8 Заголовок: Значение Тело запроса (текст страницы) 29/54
  • 30. Блин! Что еще за кэш? google://php отключить кэш  Как отключить кэширование на PHP – Создание и Продвижение Сайтов  Запрет кэширования посредством PHP – Справочник веб-языков  Записки программиста PHP – Как отключить кэширование страниц  100%-ное отключение кэширования – Форум програмистов  How to Remove Cache in PHP | eHow  … 30/54
  • 31. Пацаны, у меня фаервол Cache-Control: no-cache, no-store, must-revalidate, max-age=0 Pragma: no-cache Vary: * Expires: Thu, 01 Jan 1970 00:00:00 GMT 31/54
  • 32. 32/54
  • 33. HTTP-кэш любят все  Браузеры – быстрее открывают страницу (повторно, «Назад»)  Поисковики – быстрее индексируют  Прокси – лучше работают  А нагрузка – снижается… Защита от умника с кнопкой F5 33/54
  • 34. HTTP-кэш  Браузеры / прокси могут сохранять HTTP-ответы  Есть статус ответа HTTP 304 Not Modified  Есть заголовки для управления кэшированием Причём частично в довольно диких комбинациях  Куча костылей для проксей 34/54
  • 36. Управление HTTP-кэшированием HTTP 1.0 (по времени):  Last-Modified, If-Modified-Since  Expires, Pragma: no-cache HTTP 1.1 (по времени и значениям):  ETag, If-None-Match  Vary  Cache-Control 36/54
  • 37. Cache-Control  no-cache (запрет кэширования)  must-revalidate (костыль)  private, public (личное / публичное)  срок кэширования: max-age, s-maxage (для прокси) (осторожно!) 37/54
  • 39. Странные опции  no-transform  no-store (отвернись и не смотри)  proxy-revalidate, community=…  в запросе: max-age, only-if-cached, min- fresh, max-stale 39/54
  • 40. Long Poll (как пример кэша соединений) Задача: твиттер / вконтактик, показывать новых котиков в реальном времени. При ожидании ответа сервер подвешивает соединение клиента на N секунд. 40/54
  • 41. Заключение Для содержимого достаточно отслеживать даты изменений:  no-cache + Last-Modified: ...  304 Not Modified + Date: ... Для статики:  Большой max-age 41/54
  • 42. Кэш приложения (основное, на что мы можем повлиять!) 42/54
  • 43. Что кэшировать? Как можно бОльшие куски информации:  страницы (если можно; обычно – нельзя)  → блоки (побить на них всю страницу; обычно – можно)  → выборки (только тяжелые)  → объекты (только очень тяжелые) 43/54
  • 44. Приёмы Что делать с макаронами? [плохим кодом] 44/54
  • 45. MVC  Нет понятия «объект»? ⇒ Модель  Не можем кэшировать шаблоны, так как непонятно, где шаблоны? ⇒ View 45/54
  • 47. Lambda-Walk по связанным объектам?  Либо M-V-Presenter  Либо массовая автозагрузка 47/54
  • 48. Шаблон читает из БД… …как кэшировать? ⇒ Кэшировать после шаблона 48/54
  • 50. Иерархический MVC  Блочная структура естественна  Удобно кэшировать!  Юзают авторы поделия под названием Kohana Framework  Однако они о кэшировании НЕ ЗНАЮТ! :D и поэтому его там правильного нет 50/54
  • 51. На что ещё можно влиять Веб – не низкий уровень, до кэша CPU не спустишься :)  Кэш ЯП — заюзать (PHP: APC/XCache, остальные: предзагрузка)  Правильный сериализатор – поставить  Кэш СУБД JavaScript:  Поменьше фреймворков  Писать ручками в прототипах :)  Обработчики inline 51/54
  • 52. Кэш СУБД — примеры MySQL:  Запросы: query-cache-limit, query-cache-size  Таблицы: table-open-cache, table-definition-cache  Дисковый: innodb-buffer-pool-size  Бинлог: binlog-cache-size  Потоки: thread-cache-size PostgreSQL:  Дисковый: shared_buffers  Остальное (планы, таблицы): work_mem  Размер кэша ОС: effective_cache_size 52/54
  • 53. Резюмируем  Стараться кэшировать целые страницы  HMVC  memcached, redis  Теги, Last-Modified  PHP: обязательны APC/XCache, igbinary  Тюнить кэш СУБД  Поменьше фреймворков, побольше разума 53/54
  • 54.  http://lib.custis.ru/WebAppCaching  vfilippov d0g custis d0t ru vitalif d0g mail d0t ru 54/54