Разработка высоконагруженных web

реклама
РАЗРАБОТКА
ВЫСОКОНАГРУЖЕННЫХ WEBПРИЛОЖЕНИЙ
Кондратьев Денис
inln.ru
denis@inln.ru
РАЗРАБОТКА
ВЫСОКОНАГРУЖЕННЫХ WEBПРИЛОЖЕНИЙ
Кондратьев Денис
inln.ru
denis@inln.ru
Высоконагрузочные проекты
Производительность и
масштабируемость: 2 большие разницы
Если в архитектуре проекта не было
учтено его масштабирование – он не
будет масштабироваться
Если в архитектуре проекта было учтено
его масштабирование – то все равно
готовьтесь к проблемам с
масштабированием
Прогнозы развития проекта
Планирование роста посещаемости
Планирование роста данных
Планирование роста статического
контента
Признаки надвигающихся проблем
Искать проблемы привентивно, а не
когда все станет плачевно
Завести регламенты мониторинга
сервера и аудитов логов
Максимальное время обработки
запроса
Количество отказов обслуживания
запросов
Ошибки в логах
Непонятные ошибки
…..
Локализация проблемных мест
Premature optimization is the root of all
evil (or at least most of it) in programming.
Donald Knuth.
Не начинайте оптимизацию решения до
понимания первопричин проблем
Решаем первопричины проблемы, а не
их следствия
Локализация проблемных мест
Поиск наиболее узких мест проекта.
Поиск узких мест в инфраструктуре
Поиск неразделяемых ресурсов
Поиск наиболее тяжелых запросов
Поиск наиболее частовыполняемых
запросов
Улучшение hardware
Не нужно переделывать код
Быстрый рост, но не на долгий срок
Дорого
Проблема со стойками и
электропитанием
Увеличение расходов на
администрирование
Оптимизация запросов к БД
Анализ логов БД
Анализ плана выполнения запросов
Денормализация данных, избавляемся
от join
Уменьшение количества запросов путем
использования хранимых процедур
Выбирать только те данные, которые
нужны
Оптимизация запросов к БД
Распараллеливание запросов между
несколькими серверами БД: по частоте
обновлений, по связанности данных, по
устареванию, сегментирование
Сегментирование данных: меньше
объем информации в таблице – быстрее
выборки + легче переносить на новые
серверы БД или делать миграцию
между серверами
Пишем в мастер – читаем со слейвов
Оптимизация запросов к БД
Выделенные серверы для кеша.
Оптимизация работы кеша: кешируем
только объекты, которые часто
запрашиваются, но редко изменяются
Организация серверной площадки
Dev-серверы
Тестовые серверы
Пред-продакшен серверы
Продакшен серверы
Тестирование
Тестирование только на реальных
объемах БД
Все изменения должны проходить
обязательное тестирование на
предпродакшене до переноса на
продакшен
Никаких обновлений вечером и перед
выходными
Дистрибуция измененного кода
Общая информация о DFS
Настройка DFS для дистрибуции кода
между серверами
Настройки в IIS
Зеркала и балансер
Распределение нагрузки
Если за балансером находится
неразделяемый ресурс (БД, etc.) –
результативность балансера падает
Балансер позволяет постепенно вводить
обновления кода
Очереди задач
Переодические задачи нужно выводить
в очереди задач
Очередь задач необходимо мониторить
Позволяет синхронизовать выполнение
задач и задавать логику при ошибках
выполнения задачи в очереди
(преимущество перед стандартным
шедулером)
Можно выполнять задачи когда есть
ресурсы
Очереди задач
Логгирование и мониторинг
Отслеживать ошибки по типам:
критические/БД/…
Уведомление по СМС
Профилактический просмотр логов –
особенно после обновлений
Иметь план на возникновение аварий в
ночное время и на выходных
Если проблемы часты – то должно быть
2 админа с доступом к проекту (ноутбук
+ 3g модем)
Логгирование и мониторинг
Счетчики производительности
Трассировка
Вывод трассировки на продакшенах
Мониторинг наиболее длительных
запросов/наиболее долгих страниц
Логгирование и мониторинг
Логгирование и мониторинг
Верстка
Выделение общих элементов страницы в
общие файлы
Включать на страницу только те css/js
файлы, которые там нужны
Все стили и скрипты – в css/js файлы
Минимизация http-запросов: спрайты,
объединение файлов
Проблемы при обновлении css файлов
при кешировании в браузере у клиента
Верстка
Вынос css-файлов в начало кода
страницы, js – в конце
Компрессия и объединение css/jsфайлов
Отказ от CSS-expression
Загрузка элементов страницы по частям
– AJAX/Iframe
Разделение статики по разным
доменам/поддоменам
Оптимизация размера изображений
Уменьшение размера cookie
СПАСИБО ЗА ВНИМАНИЕ
Денис Кондратьев
inln.ru
denis@inln.ru
Скачать