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

658 views

Published on

Открытый семинар для студентов в компании CUSTIS (16 мая 2013 года).

Лектор: Виталий Филиппов, ведущий веб-разработчик.

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

Видеозапись семинара: https://vimeo.com/66739605.

Published in: Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
658
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
6
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

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

×