Рекомендации по веб-разработке (создание Real-World облачных приложений с помощью Azure)

Майк Уоссон, Рик Андерсон (, том Dykstra)

Скачивание решения ИТ-проекта или Загрузка электронной книги

Создание реальных облачных приложений с помощью электронной книги Azure основано на презентации, разработанной Скотт Гатри (. В нем объясняются 13 шаблонов и методик, которые могут помочь в успешной разработке веб-приложений для облака. Сведения о электронной книге см. в первой главе.

Первые три шаблона изходили о настройке гибкого процесса разработки. остальные находятся в архитектуре и коде. Это набор рекомендаций для веб-разработки:

Эти рекомендации действительны для всех веб-приложений, а не только для облачных приложений, но они особенно важны для облачных приложений. Они работают вместе, чтобы обеспечить оптимальное использование крайне гибкого масштабирования, предлагаемого облачной средой. Если вы не будете следовать этим рекомендациям, то при попытке масштабирования приложения будут использоваться ограничения.

Веб-уровень без отслеживания состояния за смарт-подсистемой балансировки нагрузки

Веб-уровень без отслеживания состояния означает, что вы не храните данные приложений в памяти веб-сервера или в файловой системе. Сохранение состояния веб-уровня позволяет обеспечить лучшую работу клиентов и сэкономить деньги:

  • Если веб-уровень не имеет состояния и находится за подсистемой балансировки нагрузки, можно быстро реагировать на изменения в трафике приложений, динамически добавляя или удаляя серверы. В облачной среде, где вы платите только за ресурсы сервера до тех пор, пока вы фактически используете их, возможность реагирования на изменения спроса может привести к большой экономии.
  • Веб-уровень без отслеживания состояния гораздо проще в масштабировании приложения. Это также позволяет быстрее реагировать на запросы на масштабирование и тратить меньше денег на разработку и тестирование в процессе.
  • Облачные серверы, например локальные серверы, должны быть исправлены и перезагружены периодически; а если веб-уровень не имеет состояния, перенаправление трафика при временном отключении сервера не вызывает ошибок или непредвиденного поведения.

Большинству реальных приложений требуется хранить состояние веб-сеанса; главным моментом здесь является отсутствие необходимости хранить его на веб-сервере. Состояние можно хранить другими способами, например на клиенте в файлах cookie или вне процесса на стороне сервера в состоянии сеанса ASP.NET с помощью поставщика кэша. Вы можете хранить файлы в хранилище больших двоичных объектов Windows Azure , а не в локальной файловой системе.

В качестве примера того, насколько просто масштабировать приложение на веб-сайтах Windows Azure, если веб-уровень не имеет состояния, см. вкладку масштабирование для веб-сайта Windows Azure на портале управления:

Вкладка "Масштаб"

Если вы хотите добавить веб-серверы, можно просто перетащить ползунок счетчик экземпляров вправо. Задайте для него значение 5 и нажмите кнопку сохранить. в течение нескольких секунд у вас будет 5 веб-серверов в Windows Azure, обрабатывающих трафик вашего веб-сайта.

Пять экземпляров

Вы можете точно так же задать для счетчика экземпляров значение 3 или вернуться к 1. При обратном масштабировании вы начнете экономию денег немедленно, так как плата за Windows Azure будет взиматься за минуту, а не за час.

Можно также указать Windows Azure на автоматическое увеличение или уменьшение числа веб-серверов на основе загрузки ЦП. В следующем примере, когда загрузка ЦП составляет менее 60%, число веб-серверов будет уменьшено до 2, а если загрузка ЦП превышает 80%, число веб-серверов увеличится до 4.

Масштабирование по использованию ЦП

Или что если известно, что ваш сайт будет занят только в рабочее время? Вы можете указать Windows Azure на запуск нескольких серверов в течение постоянную и сократить до одного сервера пятницы, ночей и выходных дней. В следующей серии снимков экрана показано, как настроить веб-сайт для запуска одного сервера в часы и 4 сервера в рабочее время с 8 до 17:00.

Масштабировать по расписанию

Задать время расписания

Расписание постоянную

Расписание викнигхт

Расписание выходных дней

И, конечно же, все это можно сделать в сценариях, а также на портале.

Возможность масштабирования приложения почти не ограничена в Windows Azure, так как вы не можете динамически добавлять или удалять виртуальные машины сервера, сохраняя состояние веб-уровня.

Избежание состояния сеанса

Не хранить определенные виды состояний сеансов пользователя в реальном облачном приложении бывает нецелесообразно, но разные подходы по-разному влияют на производительность и масштабируемость. Если вам нужно хранить состояния, лучшим решением будет хранить небольшой объем состояний в файлах cookie. Если это нецелесообразно, следующее лучшее решение заключается в использовании состояния сеанса ASP.NET с поставщиком для распределенного кэша в памяти. Худшее решение с точки зрения масштабируемости и производительности — использовать базу данных резервного поставщика состояний сеансов.

Использование CDN для кэширования ресурсов статических файлов

CDN — это аббревиатура для сети доставки содержимого. Вы предоставляете статические файловые ресурсы, такие как изображения и файлы скриптов, поставщику CDN, а поставщик кэширует эти файлы в центрах обработки данных по всему миру, чтобы все пользователи, обращающиеся к вашему приложению, могли получать сравнительно быстрый отклик и низкая задержка для кэшированных ресурсов. Это ускоряет общее время загрузки сайта и сокращает нагрузку на веб-серверы. CDN особенно важны, если вы достигли аудитории, которая широко распределена географически.

В Windows Azure есть CDN, и вы можете использовать другие CDN в приложении, работающем в Windows Azure или в любой среде веб-размещения.

Используйте асинхронную поддержку .NET 4.5, чтобы избежать блокирующих вызовов

В .NET 4,5 были улучшены языки программирования C# и VB, чтобы упростить асинхронную обработку задач. Преимущество асинхронного программирования заключается не только в ситуациях с параллельной обработкой, например, когда нужно запускать несколько вызовов веб-службы одновременно. Она также позволяет веб-серверу более эффективно и надежно работать в условиях высокой нагрузки. На веб-сервере доступно ограниченное количество потоков, и в условиях высокой нагрузки при использовании всех потоков входящие запросы должны ожидать освобождения потоков. Если код приложения не обрабатывает такие задачи, как запросы к базе данных и вызовы веб-службы, то многие потоки не всегда связаны, пока сервер ожидает ответа ввода-вывода. Это ограничивает объем трафика, который сервер может обслуживать при высоких условиях загрузки. При асинхронном программировании потоки, ожидающие возврата данных веб-службой или базой данных, освобождаются до обслуживания новых запросов до получения данных. В загруженном веб-сервере сотни или тысячи запросов могут быть обработаны быстро, что в противном случае будет ожидать освобождения потоков.

Как было показано ранее, можно легко уменьшить количество веб-серверов, обрабатывающих веб-сайт, так как это позволит увеличить их. Таким образом, если сервер может достичь большей пропускной способности, вам не нужно много ресурсов, и вы можете снизить затраты, так как для определенного объема трафика требуется меньшее количество серверов, чем в противном случае.

Поддержка асинхронной модели программирования .NET 4,5 включена в ASP.NET 4,5 для веб-форм, MVC и веб-API. в Entity Framework 6 и в API хранилища Windows Azure.

Поддержка асинхронных операций в ASP.NET 4,5

В ASP.NET 4,5 поддержка асинхронного программирования была добавлена не только для языка, но и для платформ MVC, веб-форм и веб-API. Например, метод действия контроллера MVC ASP.NET получает данные из веб-запроса и передает их в представление, которое затем создает HTML-код для отправки в браузер. Часто методу действия необходимо получить данные из базы данных или веб-службы, чтобы отобразить их на веб-странице или сохранить данные, указанные на веб-странице. В этих сценариях несложно сделать метод действия асинхронным: вместо возврата объекта ActionResult вы возвращаете задачу < > ActionResult и помечаете метод ключевым словом Async . Внутри метода, когда строка кода запускает операцию, включающую время ожидания, вы помечаете ее с помощью ключевого слова await.

Ниже приведен простой метод действия, который вызывает метод репозитория для запроса к базе данных:

public ActionResult Index()
{
    string currentUser = User.Identity.Name;
    var result = fixItRepository.FindOpenTasksByOwner(currentUser);

    return View(result);
}

И вот тот же метод, который обрабатывает вызов базы данных асинхронно:

public async Task<ActionResult> Index()
{
    string currentUser = User.Identity.Name;
    var result = await fixItRepository.FindOpenTasksByOwnerAsync(currentUser);

    return View(result);
}

В разделе рассматриваются компилятор создает соответствующий асинхронный код. Когда приложение выполняет вызов FindTaskByIdAsync , ASP.NET делает FindTask запрос, а затем очищает рабочий поток и делает его доступным для обработки другого запроса. По FindTask завершении запроса поток перезапускается, чтобы продолжить обработку кода, который поступает после этого вызова. Во время промежуточного интервала между моментом FindTask инициации запроса и возвратом данных у вас есть поток, позволяющий выполнить полезную работу, которая в противном случае будет привязана к ожиданию ответа.

Существует несколько дополнительных издержек для асинхронного кода, но при условиях низкого уровня нагрузки эти издержки незначительны, а в условиях высокой нагрузки можно обрабатывать запросы, которые в противном случае могут ожидать доступных потоков.

Этот тип асинхронного программирования можно выполнить с момента ASP.NET 1,1, но было сложно писать, погрешности и усложнить отладку. Теперь, когда мы упростили написание кода для него в ASP.NET 4,5, нет никаких причин.

Поддержка асинхронных операций в Entity Framework 6

В рамках асинхронной поддержки в 4,5 мы поставляли асинхронную поддержку вызовов веб-служб, сокетов и операций ввода-вывода файловой системы, но наиболее распространенный шаблон для веб-приложений — это достижение базы данных, и наши библиотеки данных не поддерживали Async. Теперь Entity Framework 6 добавляет поддержку асинхронной поддержки для доступа к базе данных.

В Entity Framework 6 все методы, которые вызывают отправку запроса или команды в базу данных, имеют асинхронные версии. В этом примере показана асинхронная версия метода Find .

public async Task<FixItTask> FindTaskByIdAsync(int id)
{
    FixItTask fixItTask = null;
    Stopwatch timespan = Stopwatch.StartNew();

    try
    {
        fixItTask = await db.FixItTasks.FindAsync(id);
        
        timespan.Stop();
        log.TraceApi("SQL Database", "FixItTaskRepository.FindTaskByIdAsync", timespan.Elapsed, "id={0}", id);
    }
    catch(Exception e)
    {
        log.Error(e, "Error in FixItTaskRepository.FindTaskByIdAsynx(id={0})", id);
    }

    return fixItTask;
}

Эта поддержка асинхронной работы не только для операций вставки, удаления, обновления и простого поиска, но также работает с запросами LINQ:

public async Task<List<FixItTask>> FindOpenTasksByOwnerAsync(string userName)
{
    Stopwatch timespan = Stopwatch.StartNew();

    try
    {
        var result = await db.FixItTasks
            .Where(t => t.Owner == userName)
            .Where(t=>t.IsDone == false)
            .OrderByDescending(t => t.FixItTaskId).ToListAsync();

        timespan.Stop();
        log.TraceApi("SQL Database", "FixItTaskRepository.FindTasksByOwnerAsync", timespan.Elapsed, "username={0}", userName);

        return result;
    }
    catch (Exception e)
    {
        log.Error(e, "Error in FixItTaskRepository.FindTasksByOwnerAsync(userName={0})", userName);
        return null;
    }
}

Существует Async версия ToList метода, так как в этом коде метод, который вызывает отправку запроса в базу данных. WhereМетоды и OrderByDescending настраивают запрос только в том случае, когда ToListAsync метод выполняет запрос и сохраняет ответ в result переменной.

Итоги

Вы можете реализовать рекомендации по веб-разработке, описанные здесь в любой платформе веб-программирования и в любой облачной среде, но у нас есть средства в ASP.NET и Windows Azure для упрощения работы. Если следовать этим шаблонам, вы можете легко масштабировать веб-уровень, и вы сократите расходы, так как каждый сервер сможет обрабатывать больше трафика.

В следующей главе рассматривается, как облако включает сценарии единого входа.

Ресурсы

Дополнительные сведения см. в следующих ресурсах.

Веб-серверы без отслеживания состояния:

СЕТЬ

Асинхронное программирование:

Дополнительные рекомендации по веб-разработке см. в следующих ресурсах: