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

  • 306 views
Uploaded on

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

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

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

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

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

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
306
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
4
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 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/WebAppCaching2/54
  • 3. О чем доклад?! Веб-приложения Кэширование Где? Внешний кэш vs память процесса Как надо? Инвалидация Оценка эффективности Как НЕ надо? Фейлы Client-side кэширование (HTTP) Приёмы server-side кэширования Дополнительные меры3/54
  • 4. Веб-приложения4/54
  • 5. Веб-приложение ≈ примерно САЙТ! Сетевое, клиент-серверное Открытые стандарты, протокол HTTPНа клиенте (клиент = браузер): Основное: HTML + CSS + JavaScriptНа сервере: Очень популярен LAMP Разное5/54
  • 6. Схема веб-приложения6/54
  • 7. Кэши есть везде!7/54
  • 8. Кэширование8/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 от Google13/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
  • 22. Типичные фейлы(Антипаттерны кэширования)Слишком мало Слишком много22/54
  • 23. Fail № 1«Положил и точно заберу»Например, сессии в memcached23/54
  • 24. Fail № 2Кэширование авторизованных страницИли одного и того же списка с выбраннымэлементом(итог – комбинаторный взрыв)24/54
  • 25. Fail № 3Аппарат искусственного дыханияБудет очень грустно его отключать(сбрасывать кэш)25/54
  • 26. Fail № 4Cache hit под 100 %, а всё тормозит!Кэшировали яро, но не то, что надо26/54
  • 27. Заключеньице Кэш – не БД! Обычно внешний кэш лучше(масштабируется) Обычно полезны теги Всегда нужна оценка работы кэша27/54
  • 28. Клиентское кэширование28/54
  • 29. HTTP Простой текстовый протокол Почти Stateless (почти REST) Keepalive – кэш соединенийЗапрос ОтветМЕТОД /адрес/?параметры HTTP/1.1Host: домен.сайтаЗаголовок: ЗначениеТело запроса (при загрузке файлов)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=0Pragma: no-cacheVary: *Expires: Thu, 01 Jan 197000:00:00 GMT31/54
  • 32. 32/54
  • 33. HTTP-кэш любят все Браузеры – быстрее открывают страницу(повторно, «Назад») Поисковики – быстрее индексируют Прокси – лучше работают А нагрузка – снижается…Защита от умника с кнопкой F533/54
  • 34. HTTP-кэш Браузеры / прокси могутсохранять HTTP-ответы Есть статус ответаHTTP 304 Not Modified Есть заголовки дляуправления кэшированиемПричём частичнов довольно диких комбинациях Куча костылей для проксей34/54
  • 35. HTTP-кэш: схема35/54
  • 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. Cache-Control no-cache (запрет кэширования) must-revalidate (костыль) private, public (личное / публичное) срок кэширования: max-age, s-maxage(для прокси)(осторожно!)37/54
  • 38. В Cache-Control……есть странные опции38/54
  • 39. Странные опции no-transform no-store (отвернись и не смотри) proxy-revalidate, community=… в запросе: max-age, only-if-cached, min-fresh, max-stale39/54
  • 40. Long Poll(как пример кэша соединений)Задача: твиттер / вконтактик,показывать новых котиков в реальном времени.При ожидании ответа сервер подвешиваетсоединение клиента на N секунд.40/54
  • 41. ЗаключениеДля содержимого достаточно отслеживатьдаты изменений: no-cache + Last-Modified: ... 304 Not Modified + Date: ...Для статики: Большой max-age41/54
  • 42. Кэш приложения(основное, на что мы можем повлиять!)42/54
  • 43. Что кэшировать?Как можно бОльшие куски информации: страницы (если можно; обычно – нельзя) → блоки (побить на них всю страницу;обычно – можно) → выборки (только тяжелые) → объекты (только очень тяжелые)43/54
  • 44. ПриёмыЧто делать с макаронами? [плохим кодом]44/54
  • 45. MVC Нет понятия «объект»? ⇒ Модель Не можем кэшировать шаблоны, так какнепонятно, где шаблоны? ⇒ View45/54
  • 46. Побочные эффекты?⇒ Инкапсулировать их в Stash46/54
  • 47. Lambda-Walkпо связанным объектам? Либо M-V-Presenter Либо массовая автозагрузка47/54
  • 48. Шаблон читает из БД……как кэшировать?⇒ Кэшировать после шаблона48/54
  • 49. HMVC49/54
  • 50. Иерархический MVC Блочная структура естественна Удобно кэшировать! Юзают авторы поделия под названиемKohana Framework Однако они о кэшировании НЕ ЗНАЮТ! :Dи поэтому его там правильного нет50/54
  • 51. На что ещё можно влиятьВеб – не низкий уровень, до кэша CPUне спустишься :) Кэш ЯП — заюзать (PHP: APC/XCache,остальные: предзагрузка) Правильный сериализатор – поставить Кэш СУБДJavaScript: Поменьше фреймворков Писать ручками в прототипах :) Обработчики inline51/54
  • 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. Резюмируем Стараться кэшировать целые страницы HMVC memcached, redis Теги, Last-Modified PHP: обязательны APC/XCache, igbinary Тюнить кэш СУБД Поменьше фреймворков, побольше разума53/54
  • 54.  http://lib.custis.ru/WebAppCaching vfilippov d0g custis d0t ruvitalif d0g mail d0t ru54/54