Сергей Чистович "Подходы к кешированию на UGC-сервисе"

30
Я.Субботник, СанктПетербург, 3 декабря 2011 года Руководитель группы сервисов общения Сергей Чистович Подходы к кешированию в UGCсервисе

description

Сергей Чистович "Подходы к кешированию на UGC-сервисе" Я.Субботник в Санкт-Петербурге О докладе: Данные на UGC-сервисах очень быстро меняются, и у каждого пользователя они свои. Выборка этих данных – дорогостоящая операция, поскольку может определяться множеством параметров и сложными условиями. Что и как мы можем кешировать в этой непростой ситуации?

Transcript of Сергей Чистович "Подходы к кешированию на UGC-сервисе"

Page 1: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

Я.Субботник,  Санкт-­‐Петербург,  3  декабря  2011  года  

Руководитель  группы  сервисов  общения  Сергей  Чистович  

Подходы  к  кешированию  в  UGC-­‐сервисе  

Page 2: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

2  

Какую  проблему  решаем?  

 —  Повышение  надёжности  и  производительности  —  уменьшение  нагрузки  на  базу  данных  

для  определённого  типа  сервисов  

Page 3: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

3  

Что  за  сервис?  

Социальная  сеть,  форум,  блогохостинг:  

—  Много  пользователей  

—  Много  статей  

—  Много  настроек  

—  Уведомления,  сообщения,  ограничения  доступа  и  т.д.  

например,  Я.ру  

Page 4: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

4  

В  каком  смысле  кеширование?  

Кеширование  –  это  набор  средств  и  приёмов  для  повышения  надёжности  и/или  производительности  системы  за  счёт  уменьшения  потребности  в  формировании  и/или  передачи  данных.      

Page 5: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

5  

Что  насчёт  архитектуры?  

Типичный  веб-­‐сервис:  

—  Снаружи  пользователи  

—  Перед  ними  веб-­‐сервер  

—  За  ним  бэкэнд  

—  А  за  ним  база  данных  (MySQL,  да?)  

Page 6: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

6  

Где  может  тормозить?  

—  Получить  данные  из  БД  

—  Сформировать  html/json/whatever  

—  Передать  по  сети  

—  Отобразить  в  браузере  

Page 7: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

Как  будем  лечить?  

7  

Page 8: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

8  

Есть  проблема?  Есть  решение!  

—  Тормозит  форматирование?  Поставь  больше  бэкэндов!  

—  Работает  всегда  

—  Просто  в  реализации  

—  Тормозят  запросы?  Шардируй  базу!  

—  Работает  отчасти  

—  Требует  программирования  

Будем  фокусироваться  на  проблемах  с  БД.  

Page 9: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

9  

Коллективное  бессознательное  

Рекомендации  по  кешированию  из  интернетов:  

—  Закешируйте  самые  популярные  блоки  

—  В  query  cache  БД  или  в  memcache  

—  Прямо  готовым  html  

не  работают  (в  нашем  случае)  

Page 10: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

10  

Кто  виноват?  

—  У  нас  нет  «популярных»  блоков  

—  У  каждого  пользователя  свой  взгляд  на  сервис  —  Ограничения  доступа  

—  Настройки  

—  Уведомления  и  счётчики  

—  Френдлента  

—  Активных  данных  гораздо  больше  

Page 11: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

11  

Что  делать?  

База  не  справляется  со  сложными  запросами?  

—  Оптимизируй  их!  —  Настрой  её!  —  Прокачай  её!  —  Не  помогло?  Слишком  много  данных?  —  Включи  голову!  

Page 12: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

12  

Корни  проблемы  

—  Данные  меняются  очень  быстро  —  Кеш  инвалидируется,  не  успев  сработать  

—  Слишком  много  параметров  —  Засорение  кеша,  низкий  hit  rate  

 

но  мы  всё-­‐таки  попробуем.  

Page 13: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

13  

Где  можно  кешировать?  

—  В  приложении  

—  В  базе  

—  Во  внешнем  кеше  

 

(и  в  чём  разница?)  

Page 14: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

14  

Пример:  глобальные  константы  

—  Можно  кешировать  в  приложении  

—  Экономия  на  запросах  или  

—  Экономия  на  сложности  запросов  

Page 15: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

15  

Пример:  счётчики  

Счётчики  уведомлений,  друзей  и  т.д.  

 

SELECT COUNT(*) FROM messages WHERE uid=12345;

 

При  большом  объёме  данных  начинает  тормозить.  

Page 16: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

16  

Счётчики  –  в  кеш  

—  Очень  компактные  данные  

—  Ключ  –  только  один  uid  

—  Изменяются  не  очень  часто  

Положим  результат  запроса  в  кеш?  

 

работает  до  какого-­‐то  предела.  

 

Page 17: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

17  

Счётчики  -­‐  инкрементальные  

—  Изменяем  значение  в  ответ  на  действия  

—   триггерами/процедурами  в  БД  

—   или  просто  в  коде  

—  Храним  в  БД  (персистентность)  

—  Нужно  иногда  пересчитывать  

Page 18: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

18  

Пример:  френдлента  

—  Тоже  может  быть  инкрементальной  

—  Но  очень  много  данных  

—  И  очень  много  обновлений  

Page 19: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

19  

А  если  более  мощный  ключ?  

—  Количество  общих  друзей  (UID1,  UID2)  

—  Информация  о  записи  (FEED,  ITEM,  UID)  

—  Блоки  в  анкете  (UID1,  CATEGORY,  UID2)  

 

Page 20: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

20  

Это  ни  в  какой  кеш  не  лезет!  

—  Хранить  только  для  избранных  

—   предсказывать  востребованность  ключа  

—  Уменьшать  кардинальность  ключа  

Page 21: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

21  

Пример:  информация  о  посте  

В  лоб:  

return getMessage(FEED, ITEM, VIEWER)

Мощность  пространства  ключей  –  N2,  и  к  тому  же  объём  данных  большой.  

Фактически  зависит  не  от  VIEWER,  а  от  relation(FEED, VIEWER).  

Page 22: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

22  

Пример:  информация  о  посте  

По  уму:  

rel = relation(FEED, VIEWER);

return getMessage(FEED, ITEM, rel);

Мощность  пространства  ключей  –  N  *  C  

Вдобавок  rel  можно  повторно  использовать  в  пределах  одного  вызова  или  даже  закешировать.  

Page 23: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

23  

Пример:  блоки  в  анкете  В  лоб:  

return getCategories(FEED, UID, category_list)

(нам  нужны  некоторые  блоки,  с  учётом  доступов)  

Сложность:  N  *  N  *  2c  

Page 24: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

24  

Пример:  блоки  в  анкете  По  уму:  rel = relation(FEED, VIEWER)

return [c for c in getCategories(FEED, rel) \

if c.name in category_list)]

 Сложность:  N,  повторно  используем  rel  из  предыдущего  примера.  

Page 25: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

25  

СУБД  vs  кеш  

Кеш  

—  Гибкая  схема  

—  Гибкое  управление  ключами  

—  Самоочищается  

—  Глупый  –  значит,  быстрый!  

СУБД  

—  Не  требует  инвалидации  

—  Есть  репликация  

—  Гарантирует  наличие  данных  

—  Джойны  и  сложные  запросы  

Page 26: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

26  

Инвалидация  кеша  —  Всегда  явная,  по  событию  —  Протухание  по  времени  –  только  для  

очистки  кеша  

—  Не  замусоривать  невостребованными  ключами  

Page 27: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

Пара  слов  о  фронтэнде  

27  

Page 28: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

28  

Фронтэнд  может  помочь  бэкэнду  

Отделить  мясное  от  молочного:  

—  OMG  фреймы  

—  AJAX  

—  localStorage  и  т.д.  

Page 29: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

29  

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

—  Условное:  If-­‐Modified-­‐Since,  Etag  

—  Лишний  запрос  

—  Нечёткая  инвалидация  

—  Безусловное:  Expires,  Cache-­‐Control  —  Без  запроса  

—  Требует  версионирования  для  инвалидации:  css/v2.0/index.css  или  css/index.css?v=2.0  

Page 30: Сергей Чистович "Подходы к кешированию на UGC-сервисе"

Руководитель  группы  сервисов  общения  

theigel@yandex-­‐team.ru  

@theigel  

 

Сергей  Чистович