РАЗРАБОТКА ВЫСОКОНАГРУЖЕННЫХ 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