37
Разработка высоконагруженных веб-сайтов на платформе ASP.NET Гайдар Магдануров t: twitter.com/gaidar e: [email protected] m: +7 (905) 504-5716

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

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

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

e: [email protected]: +7 (905) 504-5716

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

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

Объект 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;}

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

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

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

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

</asp:SqlDataSource>

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

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

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

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

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

SqlCacheDependency

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Асинхронные методы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)

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

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

Асинхронные задачи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){ }

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

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

localhost.GetLoginNamesCompletedEventHandler (ds_MyMethodCompleted);

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

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

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

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

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

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

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

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

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

Оптимизация среды выполения• 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"/>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Полезные ссылки• Платформа– Сервер 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/

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

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

e: [email protected]: +7 (905) 504-5716