Конвейер обработки потока с Azure Stream AnalyticsStream processing pipeline with Azure Stream Analytics

На схеме эталонной архитектуры представлен сквозной конвейер обработки потоков данных.This reference architecture shows an end-to-end stream processing pipeline. Конвейер принимает данные из двух источников, сопоставляет записи в двух потоках и вычисляет скользящее среднее за определенный промежуток времени.The pipeline ingests data from two sources, correlates records in the two streams, and calculates a rolling average across a time window. Результаты сохраняются для дальнейшего анализа.The results are stored for further analysis.

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

Эталонная архитектура для создания конвейера обработки потока с использованием Azure Stream Analytics

Сценарий. Компания, предоставляющая услуги такси, собирает данные о каждой поездке в такси.Scenario: A taxi company collects data about each taxi trip. В этом сценарии предполагается, что данные отправляются с двух отдельных устройств.For this scenario, we assume there are two separate devices sending data. В такси установлен счетчик, который отправляет данные о каждой поездке, включая сведения о продолжительности, расстоянии, а также местах посадки и высадки.The taxi has a meter that sends information about each ride — the duration, distance, and pickup and dropoff locations. Отдельное устройство принимает платежи от клиентов и отправляет данные о тарифах.A separate device accepts payments from customers and sends data about fares. Компании необходимо вычислить среднюю сумму чаевых на милю в реальном времени, чтобы определить тенденции.The taxi company wants to calculate the average tip per mile driven, in real time, in order to spot trends.

ArchitectureArchitecture

Архитектура состоит из следующих компонентов:The architecture consists of the following components.

Источники данных.Data sources. В этой архитектуре существует два источника данных, которые создают потоки данных в реальном времени.In this architecture, there are two data sources that generate data streams in real time. Первый поток содержит сведения о поездке, а второй — о тарифах.The first stream contains ride information, and the second contains fare information. В эталонной архитектуре есть имитированный генератор данных, который считывает данные из набора статических файлов и отправляет данные в Центры событий.The reference architecture includes a simulated data generator that reads from a set of static files and pushes the data to Event Hubs. В реальном приложении источниками данных будут устройства, установленные в такси.In a real application, the data sources would be devices installed in the taxi cabs.

Концентраторы событий Azure.Azure Event Hubs. Центры событий — это служба приема событий.Event Hubs is an event ingestion service. В этой архитектуре используется два экземпляра службы — по одной на каждый источник данных.This architecture uses two event hub instances, one for each data source. Каждый источник данных отправляет поток данных в соответствующую службу.Each data source sends a stream of data to the associated event hub.

Azure Stream Analytics.Azure Stream Analytics. Stream Analytics — это модуль обработки событий.Stream Analytics is an event-processing engine. Задание Stream Analytics считывает потоки данных из двух экземпляров и обрабатывает эти потоки.A Stream Analytics job reads the data streams from the two event hubs and performs stream processing.

Cosmos DB.Cosmos DB. Выходные данные задания Stream Analytics — это набор записей, которые регистрируются в виде документов JSON в базе данных документов Cosmos DB.The output from the Stream Analytics job is a series of records, which are written as JSON documents to a Cosmos DB document database.

Microsoft Power BI.Microsoft Power BI. Power BI — набор средств бизнес-аналитики для анализа информации о бизнесе.Power BI is a suite of business analytics tools to analyze data for business insights. В нашей архитектуре данные загружаются из Cosmos DB.In this architecture, it loads the data from Cosmos DB. Благодаря этому пользователи могут выполнять анализ полного набора собранных исторических данных.This allows users to analyze the complete set of historical data that's been collected. Также результаты можно передать в виде потока прямо из Stream Analytics в Power BI, чтобы просмотреть данные в реальном времени.You could also stream the results directly from Stream Analytics to Power BI for a real-time view of the data. Дополнительные сведения см. в статье Потоковая передача данных в реальном времени в Power BI.For more information, see Real-time streaming in Power BI.

Azure Monitor.Azure Monitor. Azure Monitor собирает метрики производительности о службах Azure, развернутых в решении.Azure Monitor collects performance metrics about the Azure services deployed in the solution. Отобразив эти данные в визуализации на панели мониторинга, можно получить полезные сведения о работоспособности решения.By visualizing these in a dashboard, you can get insights into the health of the solution.

Прием данныхData ingestion

Для имитации источника данных в этой эталонной архитектуре используется набор данных[1]New York City Taxi Data (Данные о поездках в такси в Нью-Йорке).To simulate a data source, this reference architecture uses the New York City Taxi Data dataset[1]. Этот набор данных содержит данные о поездках такси в Нью-Йорке в течение четырех лет (2010 – 2013).This dataset contains data about taxi trips in New York City over a four-year period (2010–2013). Он содержит два типа записей: «вычислить данные» и «FARE данные».It contains two types of record: ride data and fare data. Данные о поездках включают сведения о продолжительности поездки, расстоянии, а также местах посадки и высадки.Ride data includes trip duration, trip distance, and pickup and dropoff location. Данные о тарифах включают сведения о тарифе, налоге и сумме чаевых.Fare data includes fare, tax, and tip amounts. В обоих типах записей есть стандартные поля: номер медальона, лицензия на право вождения и код организации.Common fields in both record types include medallion number, hack license, and vendor ID. Вместе эти три поля позволяют уникально идентифицировать такси и водителя.Together these three fields uniquely identify a taxi plus a driver. Данные хранятся в формате CSV.The data is stored in CSV format.

[1] Донован, Брайан; "Г." (2016): Нью-Йорк, данные о поездках в такси (2010-2013).[1] Donovan, Brian; Work, Dan (2016): New York City Taxi Trip Data (2010-2013). Иллинойсский университет в Урбане-Шампейне.University of Illinois at Urbana-Champaign. https://doi.org/10.13012/J8PN93H8

Генератор данных — это приложение .NET Core, которое считывает записи и отправляет их в Центры событий Azure.The data generator is a .NET Core application that reads the records and sends them to Azure Event Hubs. Генератор отправляет данные о поездке в формате JSON, а данные о тарифах — в формате CSV.The generator sends ride data in JSON format and fare data in CSV format.

Для сегментации данных Центры событий используют секции.Event Hubs uses partitions to segment the data. Они позволяют объекту-получателю считывать данные каждой секции параллельно.Partitions allow a consumer to read each partition in parallel. При отправке данных в Центры событий можно явно указать ключ секции.When you send data to Event Hubs, you can specify the partition key explicitly. В противном случае записи назначаются секциям методом циклического перебора.Otherwise, records are assigned to partitions in round-robin fashion.

В нашем примере данные о поездках и тарифах должны в итоге иметь одинаковый идентификатор секции для определенного такси.In this particular scenario, ride data and fare data should end up with the same partition ID for a given taxi cab. Это позволит Stream Analytics применить определенную степень параллелизма при сопоставлении двух потоков.This enables Stream Analytics to apply a degree of parallelism when it correlates the two streams. Запись в секции n с данными о поездке будет соответствовать записи в секции n с данными о тарифах.A record in partition n of the ride data will match a record in partition n of the fare data.

Схема потоковой обработки с помощью Azure Stream Analytics и Центров событий Azure

В генераторе данных общая модель данных для обоих типов записей имеет свойство PartitionKey, в котором объединены Medallion, HackLicense и VendorId.In the data generator, the common data model for both record types has a PartitionKey property which is the concatenation of Medallion, HackLicense, and VendorId.

public abstract class TaxiData
{
    public TaxiData()
    {
    }

    [JsonProperty]
    public long Medallion { get; set; }

    [JsonProperty]
    public long HackLicense { get; set; }

    [JsonProperty]
    public string VendorId { get; set; }

    [JsonProperty]
    public DateTimeOffset PickupTime { get; set; }

    [JsonIgnore]
    public string PartitionKey
    {
        get => $"{Medallion}_{HackLicense}_{VendorId}";
    }

Это свойство используется для явного предоставления ключа секции при отправке в Центры событий:This property is used to provide an explicit partition key when sending to Event Hubs:

using (var client = pool.GetObject())
{
    return client.Value.SendAsync(new EventData(Encoding.UTF8.GetBytes(
        t.GetData(dataFormat))), t.PartitionKey);
}

Потоковая обработкаStream processing

Задание обработки потока определяется с помощью SQL-запроса в несколько отдельных шагов.The stream processing job is defined using a SQL query with several distinct steps. На первых двух шагах просто выбираются записи из двух входных потоков.The first two steps simply select records from the two input streams.

WITH
Step1 AS (
    SELECT PartitionId,
           TRY_CAST(Medallion AS nvarchar(max)) AS Medallion,
           TRY_CAST(HackLicense AS nvarchar(max)) AS HackLicense,
           VendorId,
           TRY_CAST(PickupTime AS datetime) AS PickupTime,
           TripDistanceInMiles
    FROM [TaxiRide] PARTITION BY PartitionId
),
Step2 AS (
    SELECT PartitionId,
           medallion AS Medallion,
           hack_license AS HackLicense,
           vendor_id AS VendorId,
           TRY_CAST(pickup_datetime AS datetime) AS PickupTime,
           tip_amount AS TipAmount
    FROM [TaxiFare] PARTITION BY PartitionId
),

На следующем шаге эти два входных потока объединяются для выбора совпадающих записей из каждого потока.The next step joins the two input streams to select matching records from each stream.

Step3 AS (
  SELECT
         tr.Medallion,
         tr.HackLicense,
         tr.VendorId,
         tr.PickupTime,
         tr.TripDistanceInMiles,
         tf.TipAmount
    FROM [Step1] tr
    PARTITION BY PartitionId
    JOIN [Step2] tf PARTITION BY PartitionId
      ON tr.Medallion = tf.Medallion
     AND tr.HackLicense = tf.HackLicense
     AND tr.VendorId = tf.VendorId
     AND tr.PickupTime = tf.PickupTime
     AND tr.PartitionId = tf.PartitionId
     AND DATEDIFF(minute, tr, tf) BETWEEN 0 AND 15
)

Этот запрос объединяет записи в набор полей, которые уникально идентифицируют совпадающие записи (Medallion, HackLicense, VendorId и PickupTime).This query joins records on a set of fields that uniquely identify matching records (Medallion, HackLicense, VendorId, and PickupTime). Инструкция JOIN также содержит идентификатор секции.The JOIN statement also includes the partition ID. Как уже упоминалось, преимущество состоит в том, что совпадающие записи всегда имеют одинаковый идентификатор секции в этом сценарии.As mentioned, this takes advantage of the fact that matching records always have the same partition ID in this scenario.

В Stream Analytics объединения являются темпоральными, то есть записи объединяются в пределах определенного временного окна.In Stream Analytics, joins are temporal, meaning records are joined within a particular window of time. В противном случае задание может бесконечно ожидать сопоставления.Otherwise, the job might need to wait indefinitely for a match. Функция DATEDIFF указывает, насколько две совпадающих записи могут быть разделены по времени для сопоставления.The DATEDIFF function specifies how far two matching records can be separated in time for a match.

На последнем шаге задания вычисляется средняя сумма чаевых на милю, сгруппированных по "прыгающему" окну в 5 минут.The last step in the job computes the average tip per mile, grouped by a hopping window of 5 minutes.

SELECT System.Timestamp AS WindowTime,
       SUM(tr.TipAmount) / SUM(tr.TripDistanceInMiles) AS AverageTipPerMile
  INTO [TaxiDrain]
  FROM [Step3] tr
  GROUP BY HoppingWindow(Duration(minute, 5), Hop(minute, 1))

Stream Analytics предоставляет несколько функций обработки методом окна.Stream Analytics provides several windowing functions. "Прыгающее" окно перемещается вперед во времени в рамках фиксированного периода, в нашем примере — на 1 минуту за прыжок.A hopping window moves forward in time by a fixed period, in this case 1 minute per hop. Результатом будет вычисление скользящего среднего за последние 5 минут.The result is to calculate a moving average over the past 5 minutes.

В показанной здесь архитектуре в Cosmos DB сохраняются только результаты задания Stream Analytics.In the architecture shown here, only the results of the Stream Analytics job are saved to Cosmos DB. Для сценария с большими данными используйте также функцию Сбор в Центрах событий, чтобы сохранять необработанные данные о событиях в хранилище BLOB-объектов Azure.For a big data scenario, consider also using Event Hubs Capture to save the raw event data into Azure Blob storage. Сохранение необработанных данных позволит вам в дальнейшем выполнять пакетные запросы к данным журнала, чтобы получить новые полезные сведения из этих данных.Keeping the raw data will allow you to run batch queries over your historical data at later time, in order to derive new insights from the data.

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

Центры событийEvent Hubs

Пропускная способность Центров событий вычисляется в единицах пропускной способности.The throughput capacity of Event Hubs is measured in throughput units. Вы можете автоматически масштабировать концентратор событий, включив автоматическое расширение. Это позволит автоматически масштабировать единицы пропускной способности в зависимости от трафика вплоть до заданного максимума.You can autoscale an event hub by enabling auto-inflate, which automatically scales the throughput units based on traffic, up to a configured maximum.

Stream AnalyticsStream Analytics

В Stream Analytics вычислительные ресурсы, выделенные для задания, измеряются в единицах потоковой передачи.For Stream Analytics, the computing resources allocated to a job are measured in Streaming Units. Задания Stream Analytics лучше всего масштабировать, если оно может выполняться параллельно.Stream Analytics jobs scale best if the job can be parallelized. Таким образом, Stream Analytics сможет распределять задания между несколькими вычислительными узлами.That way, Stream Analytics can distribute the job across multiple compute nodes.

Для входных данных Центров событий используйте ключевое слово PARTITION BY, чтобы секционировать задание Stream Analytics.For Event Hubs input, use the PARTITION BY keyword to partition the Stream Analytics job. Данные будут разделены на подмножества на основе секций Центров событий.The data will be divided into subsets based on the Event Hubs partitions.

Для функций обработки методом окна и временных объединений требуются дополнительные единицы потоковой передачи.Windowing functions and temporal joins require additional SU. По возможности используйте PARTITION BY так, чтобы каждая секция обрабатывалась отдельно.When possible, use PARTITION BY so that each partition is processed separately. Дополнительные сведения см. в статье Обзор и настройка единиц потоковой передачи.For more information, see Understand and adjust Streaming Units.

Если невозможно параллелизовать все задание Stream Analytics, попробуйте разбить его на несколько шагов, начиная с одного или нескольких параллельных шагов.If it's not possible to parallelize the entire Stream Analytics job, try to break the job into multiple steps, starting with one or more parallel steps. Так первые шаги можно будет выполнить параллельно.That way, the first steps can run in parallel. Например, как в этой эталонной архитектуре:For example, in this reference architecture:

  • Шаги 1 и 2 — это простые инструкции SELECT, которые выбирают записи из одной секции.Steps 1 and 2 are simple SELECT statements that select records within a single partition.
  • На шаге 3 выполняется секционированное объединение двух входных потоков.Step 3 performs a partitioned join across two input streams. На этом шаге используется преимущество, заключающееся в том, что совпадающие записи имеют один и тот же ключ секции. Поэтому у них всегда будет одинаковый идентификатор секции в каждом входном потоке.This step takes advantage of the fact that matching records share the same partition key, and so are guaranteed to have the same partition ID in each input stream.
  • На шаге 4 выполняется статистическое вычисление для всех секций.Step 4 aggregates across all of the partitions. Этот шаг нельзя выполнить параллельно.This step cannot be parallelized.

Используйте схему заданий в Stream Analytics, чтобы просмотреть, сколько секций назначено каждому шагу в задании.Use the Stream Analytics job diagram to see how many partitions are assigned to each step in the job. Ниже показана схема заданий для этой эталонной архитектуры:The following diagram shows the job diagram for this reference architecture:

Схема заданий

Cosmos DBCosmos DB

Пропускная способность для Cosmos DB измеряется в единицах запроса (RU).Throughput capacity for Cosmos DB is measured in Request Units (RU). Чтобы масштабировать контейнер Cosmos DB на более чем 10 000 единиц запросов, необходимо указать ключ секции при создании контейнера и добавить этот ключ в каждый документ.In order to scale a Cosmos DB container past 10,000 RU, you must specify a partition key when you create the container, and include the partition key in every document.

В этой эталонной архитектуре новые документы создаются только раз в минуту (интервал "прыгающего" окна), поэтому требования к пропускной способности довольно низкие.In this reference architecture, new documents are created only once per minute (the hopping window interval), so the throughput requirements are quite low. По этой причине нет необходимости назначать ключ секции в этом сценарии.For that reason, there's no need to assign a partition key in this scenario.

Рекомендации по мониторингуMonitoring considerations

Для любого решения обработки потоков данных очень важно отслеживать производительность и работоспособность системы.With any stream processing solution, it's important to monitor the performance and health of the system. Azure Monitor собирает журналы метрик и диагностики для служб Azure, используемых в этой архитектуре.Azure Monitor collects metrics and diagnostics logs for the Azure services used in the architecture. Служба Azure Monitor встроена в платформу Azure и не требует написания дополнительного кода в приложении.Azure Monitor is built into the Azure platform and does not require any additional code in your application.

Любой из следующих сигналов предупреждения указывает на то, что нужно масштабировать соответствующий ресурс Azure:Any of the following warning signals indicate that you should scale out the relevant Azure resource:

  • Служба "Центры событий" регулирует запросы или указывает на то, что показатели близки к превышению дневной квоты сообщений.Event Hubs throttles requests or is close to the daily message quota.
  • Задание Stream Analytics постоянно использует более 80 % выделенных единиц потоковой передачи.The Stream Analytics job consistently uses more than 80% of allocated Streaming Units (SU).
  • Cosmos DB начинает регулировать запросы.Cosmos DB begins to throttle requests.

Эталонная архитектура включает пользовательскую панель мониторинга, которая развертывается на портале Azure.The reference architecture includes a custom dashboard, which is deployed to the Azure portal. После развертывания архитектуры можно просмотреть панель мониторинга, открыв портал Azure и выбрав TaxiRidesDashboard из списка панелей мониторинга.After you deploy the architecture, you can view the dashboard by opening the Azure portal and selecting TaxiRidesDashboard from list of dashboards. Дополнительные сведения о создании и развертывании пользовательских панелей мониторинга см. в статье Создание панелей мониторинга Azure программными средствами.For more information about creating and deploying custom dashboards in the Azure portal, see Programmatically create Azure Dashboards.

На следующем изображении показана панель мониторинга приблизительно через час после запуска задания Stream Analytics.The following image shows the dashboard after the Stream Analytics job ran for about an hour.

Снимок экрана панели мониторинга поездок в такси

На внизу слева показано, что использование единиц потоковой передачи для задания Stream Analytics повышается в течение первых 15 минут и затем снижается.The panel on the lower left shows that the SU consumption for the Stream Analytics job climbs during the first 15 minutes and then levels off. Это стандартное развитие событий, так как задание достигает устойчивого состояния.This is a typical pattern as the job reaches a steady state.

Обратите внимание на то, что служба "Центры событий" регулирует запросы, как показано вверху справа.Notice that Event Hubs is throttling requests, shown in the upper right panel. Случайно отрегулированный запрос не является проблемой, так как клиентский пакет SDK службы "Центры событий" автоматически осуществляет новую попытку при получении ошибки регулирования.An occasional throttled request is not a problem, because the Event Hubs client SDK automatically retries when it receives a throttling error. Но если ошибки регулирования повторяются, значит службе требуются дополнительные единицы пропускной способности.However, if you see consistent throttling errors, it means the event hub needs more throughput units. На следующей диаграмме показан тестовый запуск с использованием функции автоматического расширения в службе "Центры событий", которая автоматически масштабирует единицы пропускной способности при необходимости.The following graph shows a test run using the Event Hubs auto-inflate feature, which automatically scales out the throughput units as needed.

Снимок экрана с окном автоматического масштабирования в Центрах событий

Функция автоматического расширения включена приблизительно в 06:35.Auto-inflate was enabled at about the 06:35 mark. Вы можете заметить снижение числа пакетов в регулируемых запросах, так как служба "Центры событий" автоматически масштабируется до трех единиц пропускной способности.You can see the p drop in throttled requests, as Event Hubs automatically scaled up to 3 throughput units.

Интересно, что это побочный эффект на увеличение использования единиц SU в задании Stream Analytics.Interestingly, this had the side effect of increasing the SU utilization in the Stream Analytics job. При регулировании в службе "Центры событий" искусственно снизилась скорость приема данных для задания Stream Analytics.By throttling, Event Hubs was artificially reducing the ingestion rate for the Stream Analytics job. Довольно часто бывает так, что при устранении одной проблемы с производительностью возникает другая.It's actually common that resolving one performance bottleneck reveals another. В таком случае проблему можно решить, выделив дополнительные единицы потоковой передачи для задания Stream Analytics.In this case, allocating additional SU for the Stream Analytics job resolved the issue.

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

Для оценки затрат используйте калькулятор цен Azure.Use the Azure pricing calculator to estimate costs. Ниже приведены некоторые рекомендации для служб, используемых в этой эталонной архитектуре.Here are some considerations for services used in this reference architecture.

Azure Stream AnalyticsAzure Stream Analytics

На Azure Stream Analytics оплачивается количество единиц потоковой передачи ($ 0,11/час), необходимое для обработки данных в службе.Azure Stream Analytics is priced by the number of streaming units ($0.11/hour) required to process the data into the service.

Stream Analytics может быть дорогостоящей, если вы не обрабатываете данные в режиме реального времени или небольшие объемы данных.Stream Analytics can be expensive if you are not processing the data in real-time or small amounts of data. В таких случаях рекомендуется использовать функции Azure или Logic Apps для перемещения данных из концентраторов событий Azure в хранилище данных.For those use cases, consider using Azure Functions or Logic Apps to move data from Azure Event Hubs to a data store.

Концентраторы событий и Azure Cosmos DB AzureAzure Event Hubs and Azure Cosmos DB

Сведения о затратах на концентраторы событий Azure и Cosmos DB см. в статье сведения о затратах см. в статье Обработка потоков с помощью Azure Databricks эталонной архитектуры.For cost considerations about Azure Event Hubs and Cosmos DB, see Cost considerations see the Stream processing with Azure Databricks reference architecture.

Развертывание решенияDeploy the solution

Чтобы выполнить развертывание и запуск эталонной реализации, выполните действия, описанные в файле сведений на GitHub.To the deploy and run the reference implementation, follow the steps in the GitHub readme.

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

  • Создайте отдельные группы ресурсов для рабочей среды, сред разработки и тестирования.Create separate resource groups for production, development, and test environments. Так будет проще управлять развертываниями, удалять тестовые развертывания и назначать права доступа.Separate resource groups make it easier to manage deployments, delete test deployments, and assign access rights.

  • Используйте шаблон Azure Resource Manager для развертывания ресурсов Azure после процесса "инфраструктура как код" (IaC).Use Azure Resource Manager template to deploy the Azure resources following the infrastructure as Code (IaC) Process. Благодаря шаблонам Автоматизация развертываний с помощью Azure DevOps Servicesили других решений CI/CD проще.With templates, automating deployments using Azure DevOps Services, or other CI/CD solutions is easier.

  • Разместите каждую рабочую нагрузку в отдельном шаблоне развертывания и храните ресурсы в системе управления версиями.Put each workload in a separate deployment template and store the resources in source control systems. Шаблоны можно развертывать вместе или по отдельности в рамках процесса CI/CD, что упрощает процесс автоматизации.You can deploy the templates together or individually as part of a CI/CD process, making the automation process easier.

    В этой архитектуре концентраторы событий Azure, Log Analytics и Cosmos DB определяются как одна рабочая нагрузка.In this architecture, Azure Event Hubs, Log Analytics, and Cosmos DB are identified as a single workload. Эти ресурсы включены в один шаблон ARM.These resources are included in a single ARM template.

  • Рассмотрите возможность промежуточного хранения рабочих нагрузок.Consider staging your workloads. Перед переходом на следующий этап выполните развертывание на различных этапах и запустите проверки на каждом этапе.Deploy to various stages and run validation checks at each stage before moving to the next stage. Таким образом, вы можете принудительно отправлять обновления в рабочие среды с высоким уровнем контроля и сокращать непредвиденные проблемы развертывания.That way you can push updates to your production environments in a highly controlled way and minimize unanticipated deployment issues.

  • Рассмотрите возможность использования Azure Monitor для анализа производительности конвейера обработки потока.Consider using Azure Monitor to analyze the performance of your stream processing pipeline. Дополнительные сведения см. в разделе monitoring Azure Databricks.For more information, see Monitoring Azure Databricks.

Дополнительные сведения см. в разделе DevOps статьи Microsoft Azure.For more information, see the DevOps section in Microsoft Azure Well-Architected Framework.

Вы можете просмотреть следующий пример сценария Azure, в котором описываются конкретные решения, использующие некоторые из этих технологий:You may wish to review the following Azure example scenarios that demonstrate specific solutions using some of the same technologies: