Processamento de eventos sem servidor

Cosmos DB
Funções
Monitor
Pipelines
Armazenamento

Essa arquitetura de referência mostra uma arquitetura orientada a eventos sem servidorque ingere um fluxo de dados, processa os dados e grava os resultados em um banco de dado back-end.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.

Logotipo do GitHub uma implementação de referência para essa arquitetura está disponível no GitHub.GitHub logo A reference implementation for this architecture is available on GitHub.

Arquitetura de referência para o processamento de evento sem servidor usando o Azure Functions

ArquiteturaArchitecture

Os Hubs de Eventos ingerem o fluxo de dados.Event Hubs ingests the data stream. Os Hubs de Eventos foram projetados para cenários de streaming de dados com alta taxa de transferência.Event Hubs is designed for high-throughput data streaming scenarios.

Observação

Para cenários de IoT, recomendamos o Hub IoT.For IoT scenarios, we recommend IoT Hub. O Hub IoT tem um ponto de extremidade interno compatível com a API de Hubs de Eventos do Azure, para que você possa usar um dos serviços nessa arquitetura sem grandes mudanças no processamento de back-end.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. Para saber mais, confira Conectar dispositivos IoT ao Azure: Hub IoT e Hubs de Eventos.For more information, see Connecting IoT Devices to Azure: IoT Hub and Event Hubs.

Aplicativo de funções.Function App. O Azure Functions é uma opção de computação sem servidor.Azure Functions is a serverless compute option. Ele usa um modelo controlado por evento, em que um trecho de código (uma "função") é invocado por um gatilho.It uses an event-driven model, where a piece of code (a “function”) is invoked by a trigger. Nessa arquitetura, quando os eventos chegam aos Hubs de Eventos, eles disparam uma função que processa os eventos e grava os resultados no armazenamento.In this architecture, when events arrive at Event Hubs, they trigger a function that processes the events and writes the results to storage.

Os Aplicativos de Funções são adequados para processar registros individuais dos Hubs de Eventos.Function Apps are suitable for processing individual records from Event Hubs. Para cenários de processamento de fluxo mais complexos, considere o Apache Spark com o Azure Databricks, ou o 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 é um serviço de banco de dados multimodelo.Cosmos DB is a multi-model database service. Para este cenário, a função de processamento de eventos armazena registros JSON, usando a API do SQL do Cosmos DB.For this scenario, the event-processing function stores JSON records, using the Cosmos DB SQL API.

Armazenamento de filas.Queue storage. O Armazenamento de filas é usado para mensagens mortas.Queue storage is used for dead letter messages. Se ocorrer um erro ao processar um evento, a função armazenará os dados do evento em uma fila de mensagens mortas para processamento posterior.If an error occurs while processing an event, the function stores the event data in a dead letter queue for later processing. Para saber mais, confira Considerações de resiliência.For more information, see Resiliency Considerations.

Azure Monitor.Azure Monitor. O Monitor coleta métricas de desempenho sobre os serviços do Azure implantados na solução.Monitor collects performance metrics about the Azure services deployed in the solution. Ao visualizá-las em um painel, você obtém informações sobre a integridade da solução.By visualizing these in a dashboard, you can get visibility into the health of the solution.

Azure Pipelines.Azure Pipelines. O Pipelines é um serviço de CI (integração contínua) e CD (entrega contínua) que compila, testa e implanta o aplicativo.Pipelines is a continuous integration (CI) and continuous delivery (CD) service that builds, tests, and deploys the application.

Considerações sobre escalabilidadeScalability considerations

Hubs de EventosEvent Hubs

A capacidade da taxa de transferência dos Hubs de Eventos é medida em unidades de produtividade.The throughput capacity of Event Hubs is measured in throughput units. É possível fazer o dimensionamento automático de um hub de eventos ao permitir a inflação automática, o que dimensiona automaticamente as unidades de produtividade com base no tráfego até um número máximo configurado.You can autoscale an event hub by enabling auto-inflate, which automatically scales the throughput units based on traffic, up to a configured maximum.

O gatilho do Hub de Eventos no aplicativo de funções é dimensionado de acordo com o número de partições no hub de eventos.The Event Hub trigger in the function app scales according to the number of partitions in the event hub. Cada partição recebe uma instância de função por vez.Each partition is assigned one function instance at a time. Para maximizar a taxa de transferência, receba os eventos em lote, em vez de um de cada vez.To maximize throughput, receive the events in a batch, instead of one at a time.

Cosmos DBCosmos DB

A capacidade da taxa de transferência para o Cosmos DB é medida em Unidades de Solicitação (RU).Throughput capacity for Cosmos DB is measured in Request Units (RU). Para dimensionar um contêiner de Cosmos DB após 10.000 RU, você deve especificar uma chave de partição ao criar o contêiner e incluir a chave de partição em cada documento que você criar.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.

Estas são algumas características de uma boa chave de partição:Here are some characteristics of a good partition key:

  • O espaço para o valor de chave é grande.The key value space is large.
  • Haverá uma distribuição uniforme de leituras/gravações por valor de chave, evitando teclas de atalho.There will be an even distribution of reads/writes per key value, avoiding hot keys.
  • O máximo de dados armazenado para qualquer valor de chave única não excederá o tamanho máximo da partição física (10 GB).The maximum data stored for any single key value will not exceed the maximum physical partition size (10 GB).
  • A chave de partição de um documento não será alterada.The partition key for a document won't change. Não é possível atualizar a chave de partição em um documento existente.You can't update the partition key on an existing document.

No cenário dessa arquitetura de referência, a função armazena exatamente um documento por dispositivo que está enviando dados.In the scenario for this reference architecture, the function stores exactly one document per device that is sending data. A função atualiza continuamente os documentos com o status mais recente do dispositivo, usando uma operação upsert.The function continually updates the documents with latest device status, using an upsert operation. A ID do dispositivo é uma boa chave de partição para esse cenário, pois as gravações serão distribuídas uniformemente entre as chaves e o tamanho de cada partição será estritamente limitado, pois há um único documento para cada valor de chave.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. Para saber mais sobre chaves de particionamento, confira Particionar e dimensionar no Azure Cosmos DB.For more information about partition keys, see Partition and scale in Azure Cosmos DB.

Considerações de resiliênciaResiliency considerations

Ao usar o gatilho dos Hubs de Eventos com o Functions, capture exceções dentro de seu loop de processamento.When using the Event Hubs trigger with Functions, catch exceptions within your processing loop. Se ocorrer uma exceção sem tratamento, o runtime do Functions não tentará novamente as mensagens.If an unhandled exception occurs, the Functions runtime does not retry the messages. Se não for possível processar uma mensagem, coloque-a em uma fila de mensagens mortas.If a message cannot be processed, put the message into a dead letter queue. Use um processo fora de banda para examinar as mensagens e determinar a ação corretiva.Use an out-of-band process to examine the messages and determine corrective action.

O código a seguir mostra como a função de ingestão captura exceções e coloca as mensagens não processadas em uma fila de mensagens mortas.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 });
        }
    }
}

Observe que a função usa a associação de saída do armazenamento de filas para colocar itens na fila.Notice that the function uses the Queue storage output binding to put items in the queue.

O código exibido acima também registra exceções em log para o Application Insights.The code shown above also logs exceptions to Application Insights. Use o número de sequência e a chave de partição para correlacionar mensagens mortas com as exceções nos logs.You can use the partition key and sequence number to correlate dead letter messages with the exceptions in the logs.

As mensagens na fila de mensagens mortas devem ter informações suficientes para você entender o contexto do erro.Messages in the dead letter queue should have enough information so that you can understand the context of error. Neste exemplo, a classe DeadLetterMessage contém a mensagem de exceção, os dados do evento original e a mensagem de evento desserializada (se estiver disponível).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; }
}

Use o Azure Monitor para monitorar o hub de eventos.Use Azure Monitor to monitor the event hub. Se você vir que há entrada, mas nenhuma saída, as mensagens não estarão sendo processadas.If you see there is input but no output, it means that messages are not being processed. Nesse caso, acesse o Log Analytics e procure exceções ou outros erros.In that case, go into Log Analytics and look for exceptions or other errors.

Considerações de recuperação de desastresDisaster recovery considerations

A implantação exibida aqui reside em uma única região do Azure.The deployment shown here resides in a single Azure region. Para uma abordagem mais resiliente à recuperação de desastres, aproveite os recursos de distribuição geográfica de vários serviços:For a more resilient approach to disaster-recovery, take advantage of geo-distribution features in the various services:

  • Hubs de eventos.Event Hubs. Crie dois namespaces de Hubs de Eventos, um namespace primário (ativo) e um namespace secundário (passivo).Create two Event Hubs namespaces, a primary (active) namespace and a secondary (passive) namespace. As mensagens são roteadas automaticamente para o namespace ativo, a menos que você faça o failover para o namespace secundário.Messages are automatically routed to the active namespace unless you fail over to the secondary namespace. Para saber mais, confira Recuperação de desastre geográfico dos Hubs de Eventos do Azure.For more information, see Azure Event Hubs Geo-disaster recovery.

  • Aplicativo de funções.Function App. Implante um segundo aplicativo de função que está aguardando leitura do namespace secundário de Hubs de Eventos.Deploy a second function app that is waiting to read from the secondary Event Hubs namespace. Essa função grava em uma conta de armazenamento secundário para a fila de mensagens mortas.This function writes to a secondary storage account for dead letter queue.

  • Cosmos DB.Cosmos DB. O Cosmos DB dá suporte a várias regiões de gravação, o que permite gravações em qualquer região que você adiciona à sua conta do cosmos DB.Cosmos DB supports multiple write regions, which enables writes to any region that you add to your Cosmos DB account. Se você não habilitar a gravação múltipla, ainda poderá fazer failover da região de gravação primária.If you don’t enable multi-write, you can still fail over the primary write region. Os SDKs de cliente do Cosmos DB e as associações do Azure Functions tratam automaticamente o failover, assim você não precisa atualizar as definições de configuração do aplicativo.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.

  • Armazenamento do Azure.Azure Storage. Use o armazenamento RA-GRS para a fila de mensagens mortas.Use RA-GRS storage for the dead letter queue. Isso cria uma réplica somente leitura em outra região.This creates a read-only replica in another region. Se a região primária ficar indisponível, você poderá ler os itens atualmente na fila.If the primary region becomes unavailable, you can read the items currently in the queue. Além disso, provisione outra conta de armazenamento na região secundária para gravação da função após um failover.In addition, provision another storage account in the secondary region that the function can write to after a fail-over.

Considerações de custoCost considerations

Use a calculadora de preços do Azure para estimar os custos.Use the Azure Pricing calculator to estimates costs. Aqui estão algumas outras considerações.Here are some other considerations.

Funções do AzureAzure Functions

O Azure Functions dá suporte a dois modelos de hospedagem.Azure Functions supports two hosting models.

  • Plano de consumo.Consumption plan.

    A potência de computação é alocada automaticamente quando o código está em execução.Compute power is automatically allocated when your code is running.

  • Plano do serviço de aplicativo .App Service plan.

    Um conjunto de VMs é alocado para seu código.A set of VMs are allocated for your code. O plano de Serviço de Aplicativo define o número de VMs e o tamanho da VM.The App Service plan defines the number of VMs and the VM size.

Nessa arquitetura, cada evento que chega nos hubs de eventos dispara uma função que processa esse evento.In this architecture, each event that arrives on Event Hubs, triggers a function that processes that event. De uma perspectiva de custo, a recomendação é usar o plano de consumo porque você paga apenas pelos recursos de computação que usa.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 faturas para taxa de transferência provisionada e armazenamento consumido por hora.Azure Cosmos DB bills for provisioned throughput and consumed storage by hour. A taxa de transferência provisionada é expressa em unidades de solicitação por segundo (RU/s), que pode ser usada para operações de banco de dados típicas, como inserções, leituras.Provisioned throughput is expressed in Request Units per second (RU/s), which can be used for typical database operations, such as inserts, reads. O preço é baseado na capacidade em RU/s que você reserva.The price is based on the capacity in RU/s that you reserve. Além disso, você precisa reservar um mínimo de 400 RUs por contêiner, em que uma leitura simultânea de documento 1 KB consome 1 RU.Also, you have to reserve a minimum of 400 RUs per container, where a concurrent read of 1KB document consumes 1 RU. Se seu aplicativo não precisar ser tão intensivo, considere usar um único contêiner, pois cada contêiner tem um custo fixo.If your app does not need to be this intensive, consider using a single container because each container has a fixed cost.

Nessa arquitetura de referência, a função armazena exatamente um documento por dispositivo que está enviando dados.In this reference architecture, the function stores exactly one document per device that is sending data. A função atualiza continuamente os documentos com o status mais recente do dispositivo, usando uma operação Upsert, que é econômica em termos de armazenamento consumido.The function continually updates the documents with latest device status, using an upsert operation, which is cost effective in terms of consumed storage. Para obter mais informações, consulte Cosmos DB modelo de preços.For more information, see Cosmos DB pricing model.

O armazenamento é cobrado para cada GB usado para os dados armazenados e o índice.Storage is billed for each GB used for your stored data and index.

Use a calculadora de capacidade de Cosmos DB para obter uma estimativa rápida do custo da carga de trabalho.Use the Cosmos DB capacity calculator to get a quick estimate of the workload cost.

Para obter mais informações, consulte a seção de custo em Microsoft Azure Well-Architected Framework.For more information, see the Cost section in Microsoft Azure Well-Architected Framework.

Considerações de DevOpsDevOps considerations

Use a infraestrutura como código (IaC) quando possível.Use Infrastructure as code (IaC) when possible. O IaC gerencia a infraestrutura, o aplicativo e os recursos de armazenamento com uma abordagem declarativa, como Azure Resource Manager.IaC manages the infrastructure, application, and storage resources with a declarative approach like Azure Resource Manager. Isso ajudará a automatizar a implantação usando o DevOps como uma solução de CI/CD (integração contínua e entrega contínua).That will help in automating deployment using DevOps as a continuous integration and continuous delivery (CI/CD) solution. Os modelos devem ter controle de versão e incluídos como parte do pipeline de lançamento.Templates should be versioned and included as part of the release pipeline.

Ao criar modelos, agrupe os recursos como uma maneira de organizá-los e isolá-los por carga de trabalho.When creating templates, group resources as a way to organize and isolate them per workload. Uma maneira comum de pensar sobre a carga de trabalho é um aplicativo único ou uma rede virtual.A common way to think about workload is a single serveless application or a virtual network. O objetivo do isolamento da carga de trabalho é associar os recursos a uma equipe, para que a equipe DevOps possa gerenciar de forma independente todos os aspectos desses recursos e executar o CI/CD.The goal of workload isolation is to associate the resources to a team, so that the DevOps team can independently manage all aspects of those resources and perform CI/CD.

Essa arquitetura inclui etapas para configurar o status drone Aplicativo de funções usando Azure Pipelines com slots YAML e Azure Functions.This architecture includes steps to configure the Drone Status Function App using Azure Pipelines with YAML and Azure Functions Slots.

À medida que implantar seus serviços, você precisará monitorá-los.As you deploy your services you will need to monitor them. Considere o uso de Application insights para permitir que os desenvolvedores monitorem o desempenho e detectem problemas.Consider using Application Insights to enable the developers to monitor performance and detect issues.

Para obter mais informações, consulte a seção DevOps em Microsoft Azure Well-Architected Framework.For more information, see the DevOps section in Microsoft Azure Well-Architected Framework.

Implantar a soluçãoDeploy the solution

Para implantar essa arquitetura de referência, confira o Leiame do GitHub.To deploy this reference architecture, view the GitHub readme.

Próximas etapasNext steps

Para saber mais sobre a implementação de referência, leia explicação do código: aplicativo sem servidor com Azure Functions.To learn more about the reference implementation, read Code walkthrough: Serverless application with Azure Functions.