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

Post on 15-Jun-2015

1.389 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Кэширование виджетов 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

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

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

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

top related