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

54
Кэширование в веб-приложениях: что? где? когда? Виталий Филиппов Ведущий веб-разработчик 16 мая 2013 года

Upload: custis

Post on 14-Dec-2014

318 views

Category:

Education


5 download

DESCRIPTION

Открытый семинар для студентов в компании CUSTIS (16 мая 2013). Лектор: Виталий Филиппов, ведущий веб-разработчик. Аннотация: Кэширование — базовый пример компромисса между временем выполнения и памятью, который используется повсеместно и в больших масштабах. На семинаре дается общий обзор приемов, а также некоторых антиприемов кэширования, используемых в веб-разработке. Вы узнаете, когда нужно применять кэширование, что, в каком количестве и где кэшировать и как оценивать эффективность кэша. Видеозапись семинара: https://vimeo.com/66739605.

TRANSCRIPT

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

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

16 мая 2013 года

Page 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

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

О чем доклад?! Веб-приложения

Кэширование Где? Внешний кэш vs память процесса Как надо? Инвалидация Оценка эффективности Как НЕ надо? Фейлы

Client-side кэширование (HTTP)

Приёмы server-side кэширования

Дополнительные меры

3/54

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

Веб-приложения

4/54

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

Веб-приложение ≈ примерно САЙТ! Сетевое, клиент-серверное

Открытые стандарты, протокол HTTP

На клиенте (клиент = браузер):

Основное: HTML + CSS + JavaScript

На сервере:

Очень популярен LAMP

Разное

5/54

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

Схема веб-приложения

6/54

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

Кэши есть везде!

7/54

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

Кэширование

8/54

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

Кэширование Обмен вычислений на память!

(То есть сохранение и повторное использование чего-нибудь)

Кэшировать можно почти все что угодно – данные, код, соединения, адреса…

9/54

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

Кэш vs БД База заранее вычисленных данных – не кэш!

Ибо:

Кэш обычно строится на лету, динамически

Записи в кэше обычно непостоянны (с этим связан Fail №1 – использование кэша как БД)

Обычно есть вытеснение: LRU / FIFO / прочие

Например, memcached – кэш, а Redis – БД.

10/54

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

Где кэшировать данные? Внешний кэш + сериализация

PHP – без вариантов, только внешний

Память процесса Управляемая? Неуправляемая?

Распределенный кэш

11/54

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

Больше проблем, чем плюсов Самая главная – Такой кэш не масштабируется!

Управляемая память: Накладные расходы = 0, объект живой Живые объекты – толстые Может прийти GC (Garbage Collector, сборщик мусора)

Неуправляемая / разделяемая (например, так делают Одноклассники):

Те же накладные расходы на сериализацию

Память процесса

12/54

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

Внешний кэш Просто и популярно — memcached ± redis

Может быть разделяемый, распределённый

Накладные расходы на сериализацию и сеть

Локально используйте UNIX-сокеты PHP: ставьте igbinary Java, C++, Python: protobuf от Google

13/54

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

Consistent hashing Для быстрого добавления/удаления узлов

14/54

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

А если данные меняются?..

15/54

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

Инвалидация кэша ⇒ Кэш нужно обновлять (сбрасывать)

Простейшие варианты:

Не сбрасывать вообще (только добавление)

Сбрасывать по ключу (если нет зависимостей)

Сбрасывать ВСЁ (если меняется всё 1 раз в день)

16/54

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

Инвалидация А если у объектов сложные зависимости?

17/54

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

По времени (TTL) Просто, но не оперативно

Удаление через заданное время жизни (TTL)

TTL без поддержки TTL: при чтении сверять срок годности

Микрокэширование: TTL = 1 секунда

18/54

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

Наиболее гибко – по тегам Тег = зависимость

На элементы кэша ставятся теги

Сброс всех ключей по тегу = обновление зависимости

Иерархия: если тег сам зависит от других

19/54

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

Теги без поддержки тегов Списочный метод: Хранить списки ключей для каждого тега Медленный сброс

Версионный метод : Сброс = инкремент версии тега При чтении сверяем версию

Но: нужен Redis!

20/54

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

Оценка эффективности кэша Главное – выигрыш в производительности Профилирование С кэшем и БЕЗ кэша Hit / Miss (попадания / промахи)

Низкие hit: горячие / взрыв / дублирование / размер Размер кэша, количество вытеснений

21/54

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

Типичные фейлы (Антипаттерны кэширования)

Слишком мало Слишком много

22/54

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

Fail № 1 «Положил и точно заберу»

Например, сессии в memcached

23/54

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

Fail № 2 Кэширование авторизованных страниц

Или одного и того же списка с выбранным элементом

(итог – комбинаторный взрыв)

24/54

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

Fail № 3 Аппарат искусственного дыхания

Будет очень грустно его отключать (сбрасывать кэш)

25/54

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

Fail № 4 Cache hit под 100 %, а всё тормозит!

Кэшировали яро, но не то, что надо

26/54

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

Заключеньице Кэш – не БД!

Обычно внешний кэш лучше (масштабируется)

Обычно полезны теги

Всегда нужна оценка работы кэша

27/54

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

Клиентское кэширование

28/54

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

HTTP Простой текстовый протокол

Почти Stateless (почти REST)

Keepalive – кэш соединений

Запрос Ответ МЕТОД /адрес/?параметры HTTP/1.1 Host: домен.сайта Заголовок: Значение Тело запроса (при загрузке файлов)

HTTP/1.1 000=код_статуса Статус Ответа Content-Type: text/html; charset=UTF-8 Заголовок: Значение Тело запроса (текст страницы)

29/54

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

Блин! Что еще за кэш? google://php отключить кэш Как отключить кэширование на PHP –

Создание и Продвижение Сайтов Запрет кэширования посредством PHP –

Справочник веб-языков Записки программиста PHP –

Как отключить кэширование страниц 100%-ное отключение кэширования –

Форум програмистов How to Remove Cache in PHP | eHow …

30/54

Page 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

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

32/54

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

HTTP-кэш любят все Браузеры – быстрее открывают страницу

(повторно, «Назад»)

Поисковики – быстрее индексируют

Прокси – лучше работают

А нагрузка – снижается…

Защита от умника с кнопкой F5

33/54

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

HTTP-кэш Браузеры / прокси могут

сохранять HTTP-ответы

Есть статус ответа HTTP 304 Not Modified

Есть заголовки для управления кэшированием Причём частично в довольно диких комбинациях

Куча костылей для проксей

34/54

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

HTTP-кэш: схема

35/54

Page 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

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

Cache-Control no-cache (запрет кэширования)

must-revalidate (костыль)

private, public (личное / публичное)

срок кэширования: max-age, s-maxage (для прокси)

(осторожно!)

37/54

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

В Cache-Control…

…есть странные опции

38/54

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

Странные опции no-transform

no-store (отвернись и не смотри)

proxy-revalidate, community=…

в запросе: max-age, only-if-cached, min-fresh, max-stale

39/54

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

Long Poll (как пример кэша соединений)

Задача: твиттер / вконтактик, показывать новых котиков в реальном времени.

При ожидании ответа сервер подвешивает соединение клиента на N секунд.

40/54

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

Заключение Для содержимого достаточно отслеживать даты изменений:

no-cache + Last-Modified: ...

304 Not Modified + Date: ...

Для статики:

Большой max-age

41/54

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

Кэш приложения

(основное, на что мы можем повлиять!)

42/54

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

Что кэшировать? Как можно бОльшие куски информации:

страницы (если можно; обычно – нельзя)

→ блоки (побить на них всю страницу; обычно – можно)

→ выборки (только тяжелые)

→ объекты (только очень тяжелые)

43/54

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

Приёмы Что делать с макаронами? [плохим кодом]

44/54

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

MVC Нет понятия «объект»? ⇒ Модель

Не можем кэшировать шаблоны, так как непонятно, где шаблоны? ⇒ View

45/54

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

Побочные эффекты? ⇒ Инкапсулировать их в Stash

46/54

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

Lambda-Walk по связанным объектам? Либо M-V-Presenter

Либо массовая автозагрузка

47/54

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

Шаблон читает из БД… …как кэшировать?

⇒ Кэшировать после шаблона

48/54

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

HMVC

49/54

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

Иерархический MVC Блочная структура естественна

Удобно кэшировать!

Юзают авторы поделия под названием Kohana Framework

Однако они о кэшировании НЕ ЗНАЮТ! :D и поэтому его там правильного нет

50/54

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

На что ещё можно влиять Веб – не низкий уровень, до кэша CPU не спустишься :) Кэш ЯП — заюзать (PHP: APC/XCache,

остальные: предзагрузка) Правильный сериализатор – поставить Кэш СУБД

JavaScript: Поменьше фреймворков Писать ручками в прототипах :) Обработчики inline

51/54

Page 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

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

Резюмируем Стараться кэшировать целые страницы

HMVC

memcached, redis

Теги, Last-Modified

PHP: обязательны APC/XCache, igbinary

Тюнить кэш СУБД

Поменьше фреймворков, побольше разума

53/54

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

http://lib.custis.ru/WebAppCaching

vfilippov d0g custis d0t ru vitalif d0g mail d0t ru

54/54