Кэш виджетов yii в redis. Отдача напрямую через nginx....

47
Кэширование виджетов Yii в Redis Трофименко Андрей

Upload: 2-

Post on 15-Jun-2015

1.388 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Кэширование виджетов Yii

в Redis

Трофименко Андрей

Page 2: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Немного о себе...

Пять лет разработки на PHP

Участие во всех крупных веб-проектах 2GIS

Тимлид команды разработки Flamp

Page 3: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко
Page 4: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко
Page 5: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко
Page 6: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко
Page 7: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Быстрый

Надежный

Понятный

Page 8: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Паттерн MVC

Page 9: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко
Page 10: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко
Page 11: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Виджет — микроконтроллер внутри контроллера

Возможность параметризации отображения

Легкое добавление / удаление

Возможность реализации бизнес-логики вне вызывающего контроллера

Page 12: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

widget

layout

Page 13: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Решения проблемы высоких нагрузок

Page 14: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Решения проблемы высоких нагрузок

Оптимизация кода

Page 15: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Решения проблемы высоких нагрузок

Оптимизация кода

Оптимизация запросов к БД

Page 16: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Решения проблемы высоких нагрузок

Оптимизация кода

Оптимизация запросов к БД

Масштабируемость

Page 17: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Решения проблемы высоких нагрузок

Оптимизация кода

Оптимизация запросов к БД

Масштабируемость

Кеширование

Page 18: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Кеширование

Page 19: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Кеширование

Результаты запросов в БД

Page 20: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Кеширование

Результаты запросов в БД

Объекты

Page 21: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Кеширование

Результаты запросов в БД

Объекты

Сгенерированный HTML-код

Page 22: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

«Писатели» 10%

Пользователи Флампа

«Читатели» 90%

Page 23: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Разный кеш для разных пользователей

«Читатели»

Простой файловый кеш Nginx

Page 24: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Разный кеш для разных пользователей

«Писатели»«Читатели»

Простой файловый кеш Nginx ?

Page 25: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Требования к системе кеширования

Эффективность

Возможность удобной инвалидации

Удобство использования

Page 26: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

И снова виджеты!

Page 27: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Виджет создает ключ на основе своих параметров в виде URI

/widget/UserProfile/id/1

Page 28: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

На странице размещается SSI инструкция

<!--# include virtual="/widget/UserProfile/id/1' -->

Page 29: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Сервер при обработке инструкции обращается к хранилищу и, если данных нет, отправляет

запрос на адрес:

http://flamp.ru/widget/UserProfile/id/1

Page 30: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Результат обработки запроса попадает в хранилище и отдается пользователю

Page 31: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Требования к хранилищу

Интеграция с nginx

Page 32: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Требования к хранилищу

Интеграция с nginx

Скорость работы

Page 33: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Требования к хранилищу

Интеграция с nginx

Скорость работы

Удобство использования

Page 34: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Требования к хранилищу

Интеграция с nginx

Скорость работы

Удобство использования

Возможность выборки ключей по шаблону

Page 35: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Возможность выборки ключей по шаблону

спасибо

Page 36: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Возможность выборки ключей по шаблону

/widget/UserProfile/id/1/view/top'

/widget/UserProfile/id/1/view/review'

/widget/UserProfile/id/1/view/profile'

Page 37: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Возможность выборки ключей по шаблону

/widget/UserProfile/user_id/1/view/top'/widget/UserProfile/user_id/1/view/review'/widget/UserProfile/user_id/1/view/profile'

Выбираем ключи по маске *user_id/1*

Удаляем найденные ключи:

Page 38: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

— то, что надо!

Прост в установке

Есть модуль для nginx

Есть расширение для PHP

Данные хранятся в памяти, но при этом сохраняются и на диск

Возможность выборки ключей по маске

Page 39: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

И все бы было хорошо, но....

Page 40: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Проблемы, проблемы...

Время выбора ключа по маске вырастает прямо пропорционально количеству записей

Из-за возрастающей нагрузки Redis не успевает обрабатывать коннекты, поэтому запросы скапливаются и сайт перестает отвечать.

Page 41: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Избавляемся от поиска по маскеИспользуем помимо линейного хранения данных именнованые неупорядоченные массивы (сеты), содержащие ключи связанных виджетов

/widget/UserProfile/user_id/1/view/top/widget/UserProfile/user_id/2/view/review/widget/UserProfile/user_id/1/view/review/widget/UserProfile/user_id/2/view/top....

Как было:

user_1/widget/UserProfile/user_id/1/view/top/widget/UserProfile/user_id/1/view/review....

user_2/widget/UserProfile/user_id/2/view/review/widget/UserProfile/user_id/2/view/top....

....

Как стало

Page 42: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Запускаем несколько нод Redis, используем Nutcracker

Nutcracker (Twinproxy) — прокси-балансировщик для Redis

Репликация не нужна — каждая нода хранит свои данные.

Page 43: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

А что дальше?

Page 44: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Виджеты отдельно, приложение отдельно

Выносим отрисовщик виджетов на отдельную ноду

Profit!

Page 45: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

[email protected]

Трофименко Андрей

Page 46: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Готов ответить на вопросы!

Page 47: Кэш виджетов Yii в Redis. Отдача напрямую через Nginx. Трофименко

Спасибо за внимание!