Разработка высоконагруженных веб-сайтов на платформе...

Preview:

DESCRIPTION

Мастер-класс, проведенный на Highload 2009.

Citation preview

Разработка высоконагруженных веб-сайтов на платформе ASP.NET

Гайдар Магдануровt: twitter.com/gaidar

e: gaidarma@microsoft.comm: +7 (905) 504-5716

Содержание• Проектирование• Кеширование• Многопоточность• Оптимизация доступа к БД• Возможности веб-сервера• Тестирование производительности

Серверная платформа

Серверная платформа разработки

Клиентская платформы разработки

Портальные решения Инструменты разработки

Проектирование• Слоеная архитектура– Выделение front-end серверов– Отделение слоя БД

• Масштабирование– Во времени (логические компоненты)– В пространстве (физические серверы)

Распределенная архитектура• Один сервер• Несколько серверов• Масштабируемая система– Дискретное добавление блоков серверов– Динамическое масштабирование– Вовлечение возможностей клиента

Реализация распределения• Веб-службы– ASMX– WCF (Windows Communication Foundation)

• Потребление данных на стороне клиента– Microsoft Ajax

Простейшие приемы• Сервер(ы) для статики• Сервер(ы) для фоновых операций– Очереди запросов– Приоретизация

• Кеширование, асинхронность, многопоточность

Кеширование• Компромисс производительность/актуальность• Снижение накладных расходов на доступ• Кеш в ASP.NET– Статические переменные; Объекты Application и

Session; Cookie файлы; Файловая система; База данных; Подсистема кэширования ASP.NET

Кеширование вывода страницы• На уровне страницы<%@ OutputCache Duration="30" VaryByParam=“None" %>

• Фрагментарное кеширование в элементах управления

Схемы кеширования страниц• В web.config<outputCacheSettings> <outputCacherofiles> <add name="Basic" duration="10" varyByParam="none" /> </outputCacheProfiles> </outputCacheSettings>

• На странице<%@ OutputCache CacheProfile="Basic" %>

Актуализация кеша страницы• Устаревание кеша• Частичное обновлениеВремя: <asp:Substitution runat="server" id="UnCachedArea"

methodname="GetDateTime" />static string GetDateTime(HttpContext context){ return DateTime.Now.ToString();

}

Объект Cachepublic DataObject GetDataObject() { string cacheKey = "key"; object cacheItem = Cache[cacheKey] as DataObject; if(cacheItem == null) { cacheItem = DbHelper.GetDataObject(); Cache.Insert(cacheKey, cacheItem, null,

DateTime.Now.Add(AppConfig.CacheDuration), TimeSpan.Zero); } return (DataObject)cacheItem;}

Актуализация и зависимости• Декларативное использование<asp:SqlDataSource ID="SupportDataSource" runat="server"

ConnectionString="<%$ConnectionStrings:DemoString %>" SelectCommand="SELECT …" EnableCaching="true"

SqlCacheDependency="Demo:Support" CacheDuration="3600" CacheExpirationPolicy="Absolute">

</asp:SqlDataSource>

Актуализация и зависимости• Программное использованиеusing (SqlConnection con = new SqlConnection(connectionString)) {

SqlCommand cm= new SqlCommand("SELECT …", con); SqlCacheDependency dep = new SqlCacheDependency(cm);

... Cache.Insert("Categories", categories, dep);}

SqlCacheDependency

Создание зависимостей• Базовый класс– System.Web.Caching.CacheDependency

• Сложные зависимости– AggregateCacheDependency

Расширение кеш-подсистемы• Механизм провайдеров для кеша и сеансаnamespace MemcachedProviders.Cache{ public abstract class CacheProvider : ProviderBase { public abstract long DefaultExpireTime { get;set;} public abstract string KeySuffix { get; set; }...

Проект Velocity• Распределенный кеш для сериализуемых

объектов CLR• Динамическое добавление кеш-узлов• Автоматическая балансировка нагрузки• Реализация в качестве Windows службы или

встраиваемая в приложение

Асинхронная обработка запросов• Асинхронный метод страницы• Асинхронные задачи• Асинхронный вызов веб-службы

Асинхронные страницы• Директива @ Page <%@ Page Async="true" AsyncTimeout="30" %>• Для асинхронных страниц возможно

использовать методы асинхронной обработки

Асинхронные методыprotected void Page_Load(object sender, EventArgs e){

AddOnPreRenderCompleteAsync(new BeginEventHandler(BeginAsync), new EndEventHandler(EndAsync) );

}public IAsyncResult BeginAsync(object sender, EventArgs e, AsyncCallback callback, object state)

{ // начинаем асинхронную операцию }public void EndAsync(IAsyncResult asyncResult)

{ // заканчиваем асинхронную операцию }

Асинхронные задачиPageAsyncTask t = new PageAsyncTask(new

BeginEventHandler(BeginAsyncM), new EndEventHandler(EndAsyncM), new EndEventHandler(OnTimeoutAsyncM), StateObject, executeInParallel);

RegisterAsyncTask(task);IAsyncResult BeginAsyncM (object sender, EventArgs e, AsyncCallback

callback, object state){ }void EndAsyncM (IAsyncResult asyncResult){ }void OnTimeoutAsyncM (IAsyncResult asyncResult){ }

Прокси-классы веб-службds = new localhost.WebService();ds.MyMethodCompleted += new

localhost.GetLoginNamesCompletedEventHandler (ds_MyMethodCompleted);

ds. MyMethodAsync();void ds_MyMethodCompleted(object sender,

localhost.МетодCompletedEventArgs e) { }

Многопоточность• Процессы, не взаимодействующие с UI• Задачи по расписанию

Реализация многопоточности

System.Threading.Thread thread = new System.Threading.Thread( new

System.Threading.ThreadStart(functionName));thread.Start();

Оптимизация среды выполения• Machine.config файл<processModel enable="true" timeout="Infinite" idleTimeout="Infinite"

shutdownTimeout="0:00:05" requestLimit="Infinite" requestQueueLimit="5000" restartQueueLimit="10“memoryLimit="60“ webGarden="false" cpuMask="0xffffffff" userName="machine“ password="AutoGenerate" logLevel="Errors“ clientConnectedCheck="0:00:05“ responseDeadlockInterval="00:03:00" maxWorkerThreads="20“ maxIoThreads="20"/>

Оптимизация среды выполения• Machine.config файл

<httpRuntime executionTimeout="90" maxRequestLength="4096"useFullyQualifiedRedirectUrl="false" minFreeThreads="8"minLocalRequestFreeThreads="4" appRequestQueueLimit="100"enableVersionHeader="true"/>

Проектирование работы с БД• Распределение данных– Частота чтения– Частота обновления– Связки между данными

• Использование разных хранилищ– Логические / физические БД– Файловый кеш / Память

Доступ к данным• ADO.NET• ORM: LINQ2SQL, Entity Framwork– Дополнительные накладные расходы– Поддержка хранимых процедур

.NET на стороне сервера• Использование .NET процедур, типов и функций• Выполнение сложных вычислительных операций• Вынесение бизнес логики на сервер

Механизмы веб-сервера• Отключение не используемых модулей• Кеширование– На уровне ядра / в пользовательском режиме

• Балансировка нагрузки– Модуль Application Request Routing

• Трассировка и логирование

Инструменты тестирования• Отдельная машина для тестирования• Эмуляция – Разных типов соединений– Разных схем поведения пользователей– Разных браузеров

Инструменты тестирования• ASP.NET Tracing• Visual Studio Team Test• Microsoft Application Center Test Tool• Web Application Stress Tool

СПАСИБО ЗА ВНИМАНИЕ!

Полезные ссылки• Платформа– Сервер http://www.iis.net – ASP.NET http://www.asp.net/ – SQL Server http://www.microsoft.com/sqlserver/

• Среда разработки– Visual Studio http://www.microsoft.com/visualstudio/ – Expression http://www.microsoft.com/expression/

Гайдар Магдануровt: twitter.com/gaidar

e: gaidarma@microsoft.comm: +7 (905) 504-5716

Recommended