Повышение масштабируемости в веб-приложении AzureImprove scalability in an Azure web application

На схеме этой эталонной архитектуры представлены сведения о проверенных методах улучшения масштабируемости и производительности в службе приложений Azure.This reference architecture shows proven practices for improving scalability and performance in an Azure App Service web application.

Логотип GitHub . Эталонная реализация для этой архитектуры доступна на сайте GitHub.GitHub logo A reference implementation for this architecture is available on GitHub.

Веб-приложение в Azure с улучшенной масштабируемостью

Скачайте файл Visio этой архитектуры.Download a Visio file of this architecture.

ArchitectureArchitecture

Эта архитектура создана на основе архитектуры, описанной в статье Basic web application (Базовое веб-приложение).This architecture builds on the one shown in Basic web application. Она содержит следующие компоненты:It includes the following components:

  • Веб-приложение.Web app. Обычно современное приложение может включать в себя и веб-сайт, и один (или несколько) веб-API RESTful.A typical modern application might include both a website and one or more RESTful web APIs. Веб-API может использоваться клиентами браузера через технологию AJAX с помощью собственных клиентских приложений или приложений на стороне сервера.A web API might be consumed by browser clients through AJAX, by native client applications, or by server-side applications. Рекомендации по разработке веб-API см. в статье API design (Проектирование API).For considerations on designing web APIs, see API design guidance.
  • Передняя дверца.Front Door. Передняя дверь — это балансировщик нагрузки уровня 7.Front Door is a layer 7 load balancer. В этой архитектуре шлюз перенаправляет HTTP-запросы к внешнему веб-интерфейсу.In this architecture, it routes HTTP requests to the web front end. Передняя дверца также предоставляет брандмауэр веб-приложения (WAF), который защищает приложение от распространенных эксплойтов и уязвимостей.Front Door also provides a web application firewall (WAF) that protects the application from common exploits and vulnerabilities.
  • Приложение-функция.Function App. Используйте приложения-функции для выполнения фоновых задач.Use Function Apps to run background tasks. Функции вызываются триггером, таким как событие таймера или помещаемое в очередь сообщение.Functions are invoked by a trigger, such as a timer event or a message being placed on queue. Для длительно выполняемых задач с отслеживанием состояния используйте устойчивые функций.For long-running stateful tasks, use Durable Functions.
  • Очередь.Queue. В архитектуре, показанной здесь, приложение выполняет запрос фоновых заданий путем помещения сообщения в очередь хранилища очередей Azure.In the architecture shown here, the application queues background tasks by putting a message onto an Azure Queue storage queue. Сообщение активирует приложение-функцию.The message triggers a function app. В качестве альтернативы можно использовать очереди служебной шины.Alternatively, you can use Service Bus queues. Сравнение см. в статье Очереди службы хранилища и очереди служебной шины: сходства и различия.For a comparison, see Azure Queues and Service Bus queues - compared and contrasted.
  • Кэш.Cache. Храните в кэше Azure частично статические данные для Redis.Store semi-static data in Azure Cache for Redis.
  • CDN.CDN. Используйте сеть доставки содержимого Azure (CDN), чтобы выполнять кэширование общедоступного содержимого с меньшей задержкой и более быстрой доставкой содержимого.Use Azure Content Delivery Network (CDN) to cache publicly available content for lower latency and faster delivery of content.
  • Хранилище данных.Data storage. Используйте базу данных SQL Azure для реляционных данных.Use Azure SQL Database for relational data. Для нереляционных данных рассмотрите возможность использования Cosmos DB.For non-relational data, consider Cosmos DB.
  • Когнитивный Поиск Azure.Azure Cognitive Search. Используйте когнитивный Поиск Azure , чтобы добавить функции поиска, такие как варианты поиска, нечеткий поиск и поиск для конкретного языка.Use Azure Cognitive Search to add search functionality such as search suggestions, fuzzy search, and language-specific search. Служба "Поиск Azure" обычно используется в сочетании с другим хранилищем данных, особенно если первичное хранилище данных требует строгой согласованности.Azure Search is typically used in conjunction with another data store, especially if the primary data store requires strict consistency. При использовании этого подхода храните достоверные данные в другом хранилище данных и используйте другой индекс поиска в службе "Поиск Azure".In this approach, store authoritative data in the other data store and the search index in Azure Search. Служба "Поиск Azure" может также использоваться для консолидации одного индекса поиска из нескольких хранилищ данных.Azure Search can also be used to consolidate a single search index from multiple data stores.
  • Azure DNS.Azure DNS. Azure DNS — это служба размещения для доменов DNS, которая предоставляет разрешение имен с помощью инфраструктуры Microsoft Azure.Azure DNS is a hosting service for DNS domains, providing name resolution using Microsoft Azure infrastructure. Размещая домены в Azure, вы можете управлять своими записями DNS с помощью тех же учетных данных, API и инструментов и оплачивать использование, как и другие службы Azure.By hosting your domains in Azure, you can manage your DNS records using the same credentials, APIs, tools, and billing as your other Azure services.

РекомендацииRecommendations

Описанная здесь архитектура может не соответствовать вашим требованиям.Your requirements might differ from the architecture described here. Используйте рекомендации из этого раздела в качестве отправной точки.Use the recommendations in this section as a starting point.

Приложения службы приложенийApp Service apps

Рекомендуется создавать веб-приложение и веб-API как отдельные приложения службы приложений.We recommend creating the web application and the web API as separate App Service apps. Такой подход позволяет запускать их в отдельных планах службы приложений, поэтому они могут масштабироваться независимо друг от друга.This design lets you run them in separate App Service plans so they can be scaled independently. Если изначально этот уровень масштабируемости не требуется, можно развертывать приложения в одном плане и позже переместить их в отдельные планы (при необходимости).If you don't need that level of scalability initially, you can deploy the apps into the same plan and move them into separate plans later if necessary.

Примечание

Для планов "Базовый", "Стандартный" и "Премиум" взимается плата за количество экземпляров виртуальных машин в плане, а не за отдельные приложения.For the Basic, Standard, and Premium plans, you are billed for the VM instances in the plan, not per app. См. раздел цены на службу приложений .See App Service Pricing

КэшCache

Вы можете повысить производительность и масштабируемость, используя кэш Azure для Redis , чтобы кэшировать некоторые данные.You can improve performance and scalability by using Azure Cache for Redis to cache some data. Попробуйте использовать кэш Azure для Redis:Consider using Azure Cache for Redis for:

  • полустатических данных транзакции;Semi-static transaction data.
  • состояния сеанса;Session state.
  • выходных данных в формате HTML.HTML output. Это может быть полезно в приложениях, которые отображают сложные выходные данные в формате HTML.This can be useful in applications that render complex HTML output.

Более подробные рекомендации по разработке стратегии кэширования см. в статье Caching (Кэширование).For more detailed guidance on designing a caching strategy, see Caching guidance.

CDNCDN

Используйте сеть доставки содержимого Azure для кэширования статического содержимого.Use Azure CDN to cache static content. Основным преимуществом CDN является возможность сократить задержку для пользователей, так как содержимое кэшируется на пограничном сервере, географически близком к пользователю.The main benefit of a CDN is to reduce latency for users, because content is cached at an edge server that is geographically close to the user. CDN позволяет сократить нагрузку на приложение, так как такой трафик не обрабатывается приложением.CDN can also reduce load on the application, because that traffic is not being handled by the application.

Если приложение состоит в основном из статических страниц, рассмотрите возможность использования сети доставки содержимого (CDN) для кэширования всего приложения.If your app consists mostly of static pages, consider using CDN to cache the entire app. Или же поместите статическое содержимое (например, образы, каскадные таблицы стилей и HTML-файлы) в службу хранилища Azure и используйте CDN для кэширования этих файлов.Otherwise, put static content such as images, CSS, and HTML files, into Azure Storage and use CDN to cache those files.

Примечание

Azure CDN не удается обработать содержимое, для которого требуется аутентификация.Azure CDN cannot serve content that requires authentication.

Более подробные инструкции см. в статье Content Delivery Network (Сеть доставки содержимого).For more detailed guidance, see Content Delivery Network (CDN) guidance.

Служба хранилищаStorage

Современные приложения часто обрабатывают большие объемы данных.Modern applications often process large amounts of data. Чтобы изменить масштаб для облака, важно выбрать правильный тип хранилища.In order to scale for the cloud, it's important to choose the right storage type. Вот несколько базовых рекомендаций.Here are some baseline recommendations.

Что нужно сохранитьWhat you want to store ПримерExample Рекомендуемое хранилищеRecommended storage
ФайлыFiles Образы, документы, PDF-файлыImages, documents, PDFs хранилище BLOB-объектов AzureAzure Blob Storage
Пары "ключ — значение"Key/Value pairs Данные профиля пользователя, обнаруженные по идентификатору пользователяUser profile data looked up by user ID табличное хранилище Azure;Azure Table storage
Короткие сообщения, предназначенные для активирования дальнейшей обработкиShort messages intended to trigger further processing Запросы на упорядочиваниеOrder requests Хранилище очередей Azure, очередь или раздел служебной шиныAzure Queue storage, Service Bus queue, or Service Bus topic
Нереляционные данные с гибкой схемой, требующей базового запросаNon-relational data with a flexible schema requiring basic querying Каталог продукцииProduct catalog База данных документов (например, Azure Cosmos DB, MongoDB или Apache CouchDB)Document database, such as Azure Cosmos DB, MongoDB, or Apache CouchDB
Реляционные данные, требующие более широкой поддержки запросов, строгой схемы и/или строгой согласованностиRelational data requiring richer query support, strict schema, and/or strong consistency Список продуктовProduct inventory База данных SQL AzureAzure SQL Database

См. статью Choose the right data store (Выбор правильного хранилища данных).See Choose the right data store.

Рекомендации по стоимостиCost considerations

Используйте кэширование, чтобы снизить нагрузку на серверы, обслуживающие содержимое, которое не изменяется часто.Use caching to reduce the load on servers that serve content that doesn't change frequently. Каждый цикл отрисовки страницы может повлиять на затраты, поскольку он потребляет ресурсы вычислений, памяти и пропускной способности.Every render cycle of a page can impact cost because it consumes compute, memory, and bandwidth. Эти затраты могут значительно снизиться с помощью кэширования, особенно для статических служб содержимого, таких как одностраничные приложения JavaScript и содержимое потоковой передачи мультимедиа.Those costs can be reduced significantly by using caching, especially for static content services, such as JavaScript single-page apps and media streaming content.

Если в приложении есть статическое содержимое, используйте CDN, чтобы снизить нагрузку на серверы переднего плана.If your app has static content, use CDN to decrease the load on the front end servers. Для данных, которые не меняются часто, используйте кэш Azure для Redis.For data that doesn't change frequently, use Azure Cache for Redis.

Приложения без отслеживания состояния, настроенные для автоматического масштабирования, более экономичны для приложений с отслеживанием состояния.Stateless apps that are configured for autoscaling are more cost effective that stateful apps. Для приложения ASP.NET храните состояние сеанса в памяти с помощью кэша Azure для Redis.For an ASP.NET application, store your session state in-memory with Azure Cache for Redis. Дополнительные сведения см. в статье поставщик состояний сеансов ASP.NET для кэша Azure для Redis.For more information, see ASP.NET Session State Provider for Azure Cache for Redis. Другой вариант — использовать Cosmos DB в качестве серверного хранилища состояний с помощью поставщика состояний сеанса.Another option is to use Cosmos DB as a backend state store through a session state provider. См. раздел Support Azure Cosmos DB и Azure Redis.See Support Azure Cosmos DB and Azure Redis.

Дополнительные сведения см. в разделе "затраты" в Microsoft Azure хорошо спроектированной инфраструктурой.For more information, see the cost section in the Microsoft Azure Well-Architected Framework.

Рассмотрите возможность размещения приложения-функции в выделенном плане службы приложений, чтобы фоновые задачи не выполнялись на тех же экземплярах, которые обрабатывали HTTP-запросы.Consider placing a function app into a dedicated App Service plan so that background tasks don't run on the same instances that handle HTTP requests. Если фоновые задачи выполняются периодически, рассмотрите возможность использования плана потребления, в рамках которого оплата начисляется на основе количества выполнений, а не за каждый час.If background tasks run intermittently, consider using a consumption plan, which is billed based on the number of executions, rather than hourly.

Используйте Калькулятор цен для оценки затрат.Use the pricing calculator to estimate costs.

Вопросы масштабируемостиScalability considerations

Главным преимуществом службы приложений Azure является возможность масштабировать приложение с учетом нагрузки.A major benefit of Azure App Service is the ability to scale your application based on load. Ниже приведены некоторые рекомендации, которые следует учитывать, если вы планируете масштабировать приложение.Here are some considerations to keep in mind when planning to scale your application.

Приложение службы приложенийApp Service app

Если решение содержит несколько приложений служб приложений, рассмотрите возможность их развертывания в разных планах службы приложений.If your solution includes several App Service apps, consider deploying them to separate App Service plans. Такой подход позволяет масштабировать их независимо друг от друга, так как они выполняются на отдельных экземплярах.This approach enables you to scale them independently because they run on separate instances.

База данных SQLSQL Database

Увеличьте уровень масштабируемости базы данных SQL путем сегментирования базы данных.Increase scalability of a SQL database by sharding the database. Сегментирование означает горизонтальное секционирование базы данных.Sharding refers to partitioning the database horizontally. Сегментирование позволяет развернуть базу данных с помощью инструментов для работы с эластичными базами данных.Sharding allows you to scale out the database horizontally using Elastic Database tools. Потенциальные преимущества сегментирования:Potential benefits of sharding include:

  • повышение пропускной способности транзакций;Better transaction throughput.
  • быстрое выполнение запросов к подмножеству данных.Queries can run faster over a subset of the data.

Azure Front DoorAzure Front Door

Передняя дверца может выполнять разгрузку SSL, а также сокращает общее число TCP-соединений с серверной частью.Front Door can perform SSL offload and also reduces the total number of TCP connections with the backend web app. Это повышает масштабируемость, поскольку веб-приложение управляет меньшим объемом подтверждений SSL и подключений TCP.This improves scalability because the web app manages a smaller volume of SSL handshakes and TCP connections. Эти выигрыши в производительности применяются, даже если вы пересылаете запросы в веб-приложение как HTTPS, из-за высокого уровня повторного использования подключения.These performance gains apply even if you forward the requests to the web app as HTTPS, due to the high level of connection reuse.

Служба "Поиск Azure" устраняет затраты на сложный поиск данных из первичного хранилища данных и может масштабироваться для обработки нагрузки.Azure Search removes the overhead of performing complex data searches from the primary data store, and it can scale to handle load. Дополнительные сведения см. в статье Масштабирование уровней ресурсов для рабочих нагрузок запросов и индексирования в Поиске Azure.See Scale resource levels for query and indexing workloads in Azure Search.

Замечания по безопасностиSecurity considerations

В этом разделе перечислены рекомендации по безопасности, относящиеся к службам Azure, описанным в этой статье.This section lists security considerations that are specific to the Azure services described in this article. Это не полный список рекомендаций по обеспечению безопасности для веб-приложений.It's not a complete list of security best practices for web applications. Дополнительные сведения о безопасности см. в статье Защита приложения в службе приложений Azure.For additional security considerations, see Secure an app in Azure App Service.

Ограничить входящий трафикRestrict incoming traffic

Настройте приложение на прием трафика только с передней дверцы.Configure the application to accept traffic only from Front Door. Это гарантирует, что весь трафик проходит через WAF перед достижением приложения.This ensures that all traffic goes through the WAF before reaching the app. Дополнительные сведения см. в разделе разделы справки заблокировать доступ к моему серверу только к передней дверце Azure?For more information, see How do I lock down the access to my backend to only Azure Front Door?

Общий доступ к ресурсам независимо от источника (CORS)Cross-Origin Resource Sharing (CORS)

При создании веб-сайта и веб-API в качестве отдельных приложений веб-сайт не может выполнить вызовы AJAX со стороны клиента в API, пока не будет включен CORS.If you create a website and web API as separate apps, the website cannot make client-side AJAX calls to the API unless you enable CORS.

Примечание

Параметры безопасности веб-браузера предотвращают отправку запросов AJAX с веб-страницы к другому домену.Browser security prevents a web page from making AJAX requests to another domain. Такое ограничение называется политикой одного источника. Эта политика предотвращает чтение вредоносным сайтом конфиденциальных данных с другого сайта.This restriction is called the same-origin policy, and prevents a malicious site from reading sensitive data from another site. CORS — это стандарт консорциума W3C, позволяющий серверу смягчить ограничения политики одного источника и разрешающий выполнять некоторые запросы независимо от источника, а другие — отклонять.CORS is a W3C standard that allows a server to relax the same-origin policy and allow some cross-origin requests while rejecting others.

В службах приложений реализована встроенная поддержка CORS без необходимости написания кода приложения.App Services has built-in support for CORS, without needing to write any application code. Дополнительные сведения см. в статье Создание API RESTful Node.js и его развертывание в приложении API в Azure.See Consume an API app from JavaScript using CORS. Добавьте веб-сайт в список разрешенных источников для API-интерфейса.Add the website to the list of allowed origins for the API.

Шифрование базы данных SQLSQL Database encryption

Используйте прозрачное шифрование данных для шифрования неактивных данных, хранящихся в базе данных.Use Transparent Data Encryption if you need to encrypt data at rest in the database. Эта функция выполняет шифрование и расшифровку всей базы данных в режиме реального времени (включая резервные копии и файлы журнала транзакций) и не требует изменений в приложении.This feature performs real-time encryption and decryption of an entire database (including backups and transaction log files) and requires no changes to the application. Шифрование вызывает небольшую задержку, поэтому рекомендуется разбить данные. Они должны быть безопасными в собственной базе данных, и шифрование необходимо выполнять только для этой базы данных.Encryption does add some latency, so it's a good practice to separate the data that must be secure into its own database and enable encryption only for that database.

Рекомендации для DevOpsDevOps considerations

Внешнее развертываниеFront-end deployment

Эта архитектура построена на базе, показанной в разделе основные веб-приложения, см. раздел рекомендации по DevOps.This architecture builds on the one shown in Basic web application, see the DevOps considerations section.

Дальнейшие действияNext steps