Обработка событий без использования сервера с помощью Функций AzureServerless event processing using Azure Functions

В этой эталонной архитектуре показана ориентированная на события архитектура, котораяпринимает поток данных, обрабатывает их и записывает результаты в базу данных серверной части.This reference architecture shows a serverless, event-driven architecture that ingests a stream of data, processes the data, and writes the results to a back-end database.

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

Эталонная архитектура для бессерверной обработки событий с помощью Функций Azure

АрхитектураArchitecture

Центры событий принимают поток данных.Event Hubs ingests the data stream. Служба Центры событий предназначена для сценариев потоковой передачи данных с высокой пропускной способностью.Event Hubs is designed for high-throughput data streaming scenarios.

Примечание

Для сценариев Интернета вещей мы рекомендуем использовать Центр Интернета вещей.For IoT scenarios, we recommend IoT Hub. Центр Интернета вещей содержит встроенную конечную точку, которая совместима с API Центров событий Azure, поэтому вы можете использовать любую службу в этой архитектуре без существенных изменений внутренней обработки.IoT Hub has a built-in endpoint that’s compatible with the Azure Event Hubs API, so you can use either service in this architecture with no major changes in the backend processing. Дополнительные сведения см. в статье Подключение устройств Интернета вещей в Azure. Центр Интернета вещей и Центры событий.For more information, see Connecting IoT Devices to Azure: IoT Hub and Event Hubs.

Приложение-функция.Function App. Функции Azure — это независимая от сервера служба вычислений.Azure Functions is a serverless compute option. Она использует управляемую событиями модель, где часть кода ("функция") вызывается триггером.It uses an event-driven model, where a piece of code (a “function”) is invoked by a trigger. В этой архитектуре, когда события поступают в Центры событий, они инициируют функцию, которая обрабатывает события и записывает результаты в хранилище.In this architecture, when events arrive at Event Hubs, they trigger a function that processes the events and writes the results to storage.

Приложения-функции подходят для обработки отдельных записей из Центров событий.Function Apps are suitable for processing individual records from Event Hubs. Для более сложных сценариев обработки потока рассмотрите Apache Spark с использованием Azure Databricks или Azure Stream Analytics.For more complex stream processing scenarios, consider Apache Spark using Azure Databricks, or Azure Stream Analytics.

Cosmos DB.Cosmos DB. Cosmos DB — многомодельная служба базы данных.Cosmos DB is a multi-model database service. В этом сценарии функция обработки событий сохраняет записи JSON с помощью SQL API Cosmos DB.For this scenario, the event-processing function stores JSON records, using the Cosmos DB SQL API.

Хранилище очередей.Queue storage. Хранилище очередей используется для недоставленных сообщений.Queue storage is used for dead letter messages. Если при обработке события возникает ошибка, функция сохраняет данные события в очереди недоставленных сообщений для последующей обработки.If an error occurs while processing an event, the function stores the event data in a dead letter queue for later processing. Дополнительные сведения см. в разделе Рекомендации по обеспечению устойчивости.For more information, see Resiliency Considerations.

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

Azure Pipelines.Azure Pipelines. Pipelines — это служба непрерывной интеграции (CI) и непрерывной поставки (CD), которая выполняет сборку, тестирование и развертывание приложений.Pipelines is a continuous integration (CI) and continuous delivery (CD) service that builds, tests, and deploys the application.

Вопросы масштабируемости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.

Триггер концентратора событий в приложении-функции масштабируется в соответствии с числом секций в концентраторе событий.The Event Hub trigger in the function app scales according to the number of partitions in the event hub. Каждой секции назначается один экземпляр функции за раз.Each partition is assigned one function instance at a time. Для увеличения пропускной способности получайте события в пакете, а не по одному за раз.To maximize throughput, receive the events in a batch, instead of one at a time.

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 that you create.

Вот некоторые характеристики хорошего ключа секции:Here are some characteristics of a good partition key:

  • Значение пространства ключа велико.The key value space is large.
  • Будет существовать равномерное распределение операций чтения и записи на значение ключа, что позволит избежать горячих ключей.There will be an even distribution of reads/writes per key value, avoiding hot keys.
  • Максимальный объем данных, хранимых для любого отдельного значения ключа, не может превышать максимальный физический размер секции (10 ГБ).The maximum data stored for any single key value will not exceed the maximum physical partition size (10 GB).
  • Ключ секции для документа не изменится.The partition key for a document won't change. Обновить ключ секции для существующего документа невозможно.You can't update the partition key on an existing document.

В сценарии для этой эталонной архитектуры функция хранит только один документ для устройства, отправляющего данные.In the scenario for this reference architecture, the function stores exactly one document per device that is sending data. Функция постоянно обновляет в документах последнее состояние устройства, используя операцию Upsert.The function continually updates the documents with latest device status, using an upsert operation. Идентификатор устройства является подходящим ключом секции для этого сценария, так как записи будут равномерно распределены по ключам, а размер каждой секции будет строго ограничен, потому что для каждого значения ключа существует отдельный документ.Device ID is a good partition key for this scenario, because writes will be evenly distributed across the keys, and the size of each partition will be strictly bounded, because there is a single document for each key value. Дополнительные сведения о ключах секций см. в статье Секционирование и масштабирование в Azure Cosmos DB.For more information about partition keys, see Partition and scale in Azure Cosmos DB.

Рекомендации по обеспечению устойчивостиResiliency considerations

При использовании триггера Центров событий с Функциями перехват исключений происходит в цикле обработки.When using the Event Hubs trigger with Functions, catch exceptions within your processing loop. Если возникает необработанное исключение, среда выполнения Функций не выполняет повторную попытку отправки сообщения.If an unhandled exception occurs, the Functions runtime does not retry the messages. Если сообщение не может быть обработано, поместите его в очередь недоставленных сообщений.If a message cannot be processed, put the message into a dead letter queue. Используйте внешний процесс, чтобы изучить сообщения и определить корректирующее действие.Use an out-of-band process to examine the messages and determine corrective action.

В следующем коде показано, как функция приема перехватывает исключения и помещает необработанные сообщения в очередь недоставленных сообщений.The following code shows how the ingestion function catches exceptions and puts unprocessed messages onto a dead letter queue.

[FunctionName("RawTelemetryFunction")]
[StorageAccount("DeadLetterStorage")]
public static async Task RunAsync(
    [EventHubTrigger("%EventHubName%", Connection = "EventHubConnection", ConsumerGroup ="%EventHubConsumerGroup%")]EventData[] messages,
    [Queue("deadletterqueue")] IAsyncCollector<DeadLetterMessage> deadLetterMessages,
    ILogger logger)
{
    foreach (var message in messages)
    {
        DeviceState deviceState = null;

        try
        {
            deviceState = telemetryProcessor.Deserialize(message.Body.Array, logger);
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "Error deserializing message", message.SystemProperties.PartitionKey, message.SystemProperties.SequenceNumber);
            await deadLetterMessages.AddAsync(new DeadLetterMessage { Issue = ex.Message, EventData = message });
        }

        try
        {
            await stateChangeProcessor.UpdateState(deviceState, logger);
        }
        catch (Exception ex)
        {
            logger.LogError(ex, "Error updating status document", deviceState);
            await deadLetterMessages.AddAsync(new DeadLetterMessage { Issue = ex.Message, EventData = message, DeviceState = deviceState });
        }
    }
}

Обратите внимание, что функция использует выходную привязку хранилища очередей, чтобы поместить элементы в очередь.Notice that the function uses the Queue storage output binding to put items in the queue.

Приведенный выше код также регистрирует исключения в Application Insights.The code shown above also logs exceptions to Application Insights. Ключ секции и порядковый номер можно использовать для корреляции сообщений в очереди недоставленных сообщений с исключениями в журналах.You can use the partition key and sequence number to correlate dead letter messages with the exceptions in the logs.

Сообщения в очереди недоставленных сообщений должны содержать достаточно информации, чтобы можно было понять контекст ошибки.Messages in the dead letter queue should have enough information so that you can understand the context of error. В этом примере класс DeadLetterMessage содержит сообщение об исключении, исходные данные события и десериализованное сообщение о событии (если доступно).In this example, the DeadLetterMessage class contains the exception message, the original event data, and the deserialized event message (if available).

public class DeadLetterMessage
{
    public string Issue { get; set; }
    public EventData EventData { get; set; }
    public DeviceState DeviceState { get; set; }
}

Используйте Azure Monitor для мониторинга концентратора событий.Use Azure Monitor to monitor the event hub. Если вы видите, что есть входные данные, но нет выходных, это означает, что сообщения не обрабатываются.If you see there is input but no output, it means that messages are not being processed. В таком случае перейдите в Log Analytics и поищите исключения или другие ошибки.In that case, go into Log Analytics and look for exceptions or other errors.

Рекомендации по аварийному восстановлениюDisaster recovery considerations

Представленное здесь развертывание расположено в одном регионе Azure.The deployment shown here resides in a single Azure region. Для более гибкого подхода к аварийному восстановлению воспользуйтесь функциями геораспределения в различных службах:For a more resilient approach to disaster-recovery, take advantage of geo-distribution features in the various services:

  • Концентраторы событий.Event Hubs. Создайте два пространства имен Центров событий: основное (активное) и дополнительное (пассивное).Create two Event Hubs namespaces, a primary (active) namespace and a secondary (passive) namespace. Сообщения автоматически перенаправляются в активное пространство имен, если вы не выполните отработку отказа в дополнительное пространство имен.Messages are automatically routed to the active namespace unless you fail over to the secondary namespace. Дополнительные сведения см. в статье Географическое аварийное восстановление в Центрах событий Azure.For more information, see Azure Event Hubs Geo-disaster recovery.

  • Приложение-функция.Function App. Разверните второе приложение-функцию, которое ожидает считывания из дополнительного пространства имен Центров событий.Deploy a second function app that is waiting to read from the secondary Event Hubs namespace. Эта функция выполняет запись в дополнительную учетную запись хранения для очереди недоставленных сообщений.This function writes to a secondary storage account for dead letter queue.

  • Cosmos DB.Cosmos DB. Cosmos DB поддерживает несколько основных регионов, что позволяет записывать данные в любой регион, добавляемый в учетную запись Cosmos DB.Cosmos DB supports multiple master regions, which enables writes to any region that you add to your Cosmos DB account. Если не включить несколько источников, можно по-прежнему выполнить отработку отказа в основной регион записи.If you don’t enable multi-master, you can still fail over the primary write region. Клиентские пакеты SDK Cosmos DB и привязки функций Azure автоматически выполняют отработку отказа, поэтому нет необходимости обновлять параметры конфигурации приложения.The Cosmos DB client SDKs and the Azure Function bindings automatically handle the failover, so you don’t need to update any application configuration settings.

  • Хранилище Azure.Azure Storage. Используйте хранилище RA-GRS для очереди недоставленных сообщений.Use RA-GRS storage for the dead letter queue. В таком случае создается реплика только для чтения в другом регионе.This creates a read-only replica in another region. Если основной регион становится недоступным, вы можете считывать элементы, находящиеся в очереди.If the primary region becomes unavailable, you can read the items currently in the queue. Кроме того, можно подготовить другую учетную запись хранения в дополнительном регионе, в которую функция сможет записывать данные после отработки отказа.In addition, provision another storage account in the secondary region that the function can write to after a fail-over.

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

Используйте Калькулятор цен Azure для оценки затрат.Use the Azure Pricing calculator to estimates costs. Ниже приведены некоторые другие рекомендации.Here are some other considerations.

Функции AzureAzure Functions

Функции Azure поддерживают две модели размещения.Azure Functions supports two hosting models.

  • План потребления.Consumption plan.

    Мощность вычислений автоматически выделяется при выполнении кода.Compute power is automatically allocated when your code is running.

  • План службы приложений .App Service plan.

    Набор виртуальных машин выделяется для кода.A set of VMs are allocated for your code. План службы приложений определяет число и размер виртуальных машин.The App Service plan defines the number of VMs and the VM size.

В этой архитектуре каждое событие, поступающие в концентраторы событий, активирует функцию, которая обрабатывает это событие.In this architecture, each event that arrives on Event Hubs, triggers a function that processes that event. С точки зрения затрат рекомендуется использовать план потребления , так как вы платите только за используемые ресурсы вычислений.From a cost perspective, the recommendation is to use consumption plan because you pay only for the compute resources you use.

Azure Cosmos DBAzure Cosmos DB

Azure Cosmos DB векселя на подготовленную пропускную способность и потребляемую память за час.Azure Cosmos DB bills for provisioned throughput and consumed storage by hour. Подготовленная пропускная способность выражается в единицах запросов в секунду, которые могут использоваться для типичных операций с базами данных, таких как операции вставки, чтения.Provisioned throughput is expressed in Request Units per second (RU/s), which can be used for typical database operations, such as inserts, reads. Цена зависит от емкости зарезервированных единиц запросов в секунду.The price is based on the capacity in RU/s that you reserve. Кроме того, необходимо зарезервировать как минимум 400 в каждый контейнер, где параллельное чтение документа 1 КБ потребляет 1 ЕДИНИЦу.Also, you have to reserve a minimum of 400 RUs per container, where a concurrent read of 1KB document consumes 1 RU. Если приложение не нуждается в такой интенсивности, рекомендуется использовать один контейнер, так как каждый контейнер имеет фиксированные затраты.If your app does not need to be this intensive, consider using a single container because each container has a fixed cost.

В этой эталонной архитектуре функция хранит только один документ для каждого устройства, отправляющего данные.In this reference architecture, the function stores exactly one document per device that is sending data. Функция постоянно обновляет документы с последним состоянием устройства, используя операцию Upsert, которая является экономичной с точки зрения используемого хранилища.The function continually updates the documents with latest device status, using an upsert operation, which is cost effective in terms of consumed storage. Дополнительные сведения см. в разделе модель ценообразования Cosmos DB.For more information, see Cosmos DB pricing model.

Плата за хранилище взимается за каждый ГБ, используемый для хранимых данных и индекса.Storage is billed for each GB used for your stored data and index.

Используйте Калькулятор емкости Cosmos DB , чтобы быстро оценить стоимость рабочей нагрузки.Use the Cosmos DB capacity calculator to get a quick estimate of the workload cost.

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

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

Чтобы развернуть эту эталонную архитектуру, просмотрите файл сведений на GitHub.To deploy this reference architecture, view the GitHub readme.

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

Дополнительные сведения о реализации эталонного кода см. в разделе Пошаговое руководство по использованию приложений с помощью функций Azure.To learn more about the reference implementation, read Code walkthrough: Serverless application with Azure Functions.