View
1.393
Download
0
Category
Preview:
Citation preview
Кэширование виджетов Yii
в Redis
Трофименко Андрей
Немного о себе...
Пять лет разработки на PHP
Участие во всех крупных веб-проектах 2GIS
Тимлид команды разработки Flamp
Быстрый
Надежный
Понятный
Паттерн MVC
Виджет — микроконтроллер внутри контроллера
Возможность параметризации отображения
Легкое добавление / удаление
Возможность реализации бизнес-логики вне вызывающего контроллера
widget
layout
Решения проблемы высоких нагрузок
Решения проблемы высоких нагрузок
Оптимизация кода
Решения проблемы высоких нагрузок
Оптимизация кода
Оптимизация запросов к БД
Решения проблемы высоких нагрузок
Оптимизация кода
Оптимизация запросов к БД
Масштабируемость
Решения проблемы высоких нагрузок
Оптимизация кода
Оптимизация запросов к БД
Масштабируемость
Кеширование
Кеширование
Кеширование
Результаты запросов в БД
Кеширование
Результаты запросов в БД
Объекты
Кеширование
Результаты запросов в БД
Объекты
Сгенерированный HTML-код
«Писатели» 10%
Пользователи Флампа
«Читатели» 90%
Разный кеш для разных пользователей
«Читатели»
Простой файловый кеш Nginx
Разный кеш для разных пользователей
«Писатели»«Читатели»
Простой файловый кеш Nginx ?
Требования к системе кеширования
Эффективность
Возможность удобной инвалидации
Удобство использования
И снова виджеты!
Виджет создает ключ на основе своих параметров в виде URI
/widget/UserProfile/id/1
На странице размещается SSI инструкция
<!--# include virtual="/widget/UserProfile/id/1' -->
Сервер при обработке инструкции обращается к хранилищу и, если данных нет, отправляет
запрос на адрес:
http://flamp.ru/widget/UserProfile/id/1
Результат обработки запроса попадает в хранилище и отдается пользователю
Требования к хранилищу
Интеграция с nginx
Требования к хранилищу
Интеграция с nginx
Скорость работы
Требования к хранилищу
Интеграция с nginx
Скорость работы
Удобство использования
Требования к хранилищу
Интеграция с nginx
Скорость работы
Удобство использования
Возможность выборки ключей по шаблону
Возможность выборки ключей по шаблону
спасибо
Возможность выборки ключей по шаблону
/widget/UserProfile/id/1/view/top'
/widget/UserProfile/id/1/view/review'
/widget/UserProfile/id/1/view/profile'
Возможность выборки ключей по шаблону
/widget/UserProfile/user_id/1/view/top'/widget/UserProfile/user_id/1/view/review'/widget/UserProfile/user_id/1/view/profile'
Выбираем ключи по маске *user_id/1*
Удаляем найденные ключи:
— то, что надо!
Прост в установке
Есть модуль для nginx
Есть расширение для PHP
Данные хранятся в памяти, но при этом сохраняются и на диск
Возможность выборки ключей по маске
И все бы было хорошо, но....
Проблемы, проблемы...
Время выбора ключа по маске вырастает прямо пропорционально количеству записей
Из-за возрастающей нагрузки Redis не успевает обрабатывать коннекты, поэтому запросы скапливаются и сайт перестает отвечать.
Избавляемся от поиска по маскеИспользуем помимо линейного хранения данных именнованые неупорядоченные массивы (сеты), содержащие ключи связанных виджетов
/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....
....
Как стало
Запускаем несколько нод Redis, используем Nutcracker
Nutcracker (Twinproxy) — прокси-балансировщик для Redis
Репликация не нужна — каждая нода хранит свои данные.
А что дальше?
Виджеты отдельно, приложение отдельно
Выносим отрисовщик виджетов на отдельную ноду
Profit!
a.trofimenko@flamp.ru
Трофименко Андрей
Готов ответить на вопросы!
Спасибо за внимание!
Recommended