Bem-vindo ao setimo artigo da nossa série sobre integração de Azure Functions com serviços do Azure, utilizando ás melhores práticas de programação! 🎉 Já exploramos o Azure containers, Azure Key Vault, Azure Web PubSub e o Azure Service Bus. Agora, vamos mergulhar no Azure Event Hub, um serviço de transmissão de dados em grande escala. 📊
OBS: Para ver como integrar ao Azure Service Bus e o Azure Web PubSub veja:
- Dominando o Azure Web PubSub com Azure Functions e TypeScript
- Tudo que precisa saber para integrar seu Azure Service Bus a sua Azure Function com Factory Pattern…
Agora, falando um pouco sobre o Azure Event Hubs, destaca-se por ser um serviço de ingestão de dados em tempo real e de transmissão de eventos em larga escala. É projetado para facilitar a coleta, processamento e análise de grandes volumes de dados de eventos, gerados por aplicativos, dispositivos e sensores. Aqui estão alguns pontos-chave para entender o Azure Event Hubs:
Características Principais
- Ingestão de Dados em Alta Velocidade: O Event Hubs pode ingerir milhões de eventos por segundo, permitindo que você colete dados em tempo real de diversas fontes.
- Bufferização de Dados: Ele atua como um buffer temporário, armazenando eventos por um período configurável, o que permite que consumidores de dados os processem em seus próprios ritmos.
- Particionamento: Eventos podem ser particionados para permitir a ingestão paralela e a escalabilidade horizontal, o que melhora a capacidade de processamento.
- Transmissão de Eventos: Além de coletar dados, o Event Hubs pode transmitir eventos para múltiplos consumidores, permitindo que diferentes sistemas e serviços consumam os dados simultaneamente.
- Suporte a Diversas Plataformas e Linguagens: Você pode enviar eventos para o Event Hubs usando uma variedade de linguagens de programação e plataformas, incluindo .NET, Java, Python, Node.js e mais.
- Segurança e Conformidade: O Event Hubs oferece segurança robusta com autenticação e autorização baseadas em Microsoft Entra ID (antigo AAD) e chaves SAS (Shared Access Signature).
Casos de Uso
- Monitoramento de Aplicações e Infraestrutura:Coletar logs e métricas de servidores, contêineres e aplicativos para análise e monitoramento em tempo real.
- Processamento de Dados em Tempo Real: Analisar dados de sensores IoT (Internet of Things), transações financeiras, e-commerce, e muito mais em tempo real.
- ETL (Extract, Transform, Load): Integrar dados de várias fontes, transformá-los conforme necessário e carregá-los em sistemas de armazenamento ou bancos de dados.
- Análise de Clickstream: Rastrear e analisar cliques e interações de usuários em sites e aplicativos para insights de comportamento e personalização.
- Integração com Outros Serviços do Azure: O Event Hubs se integra bem com outros serviços do Azure, como Azure Stream Analytics, Azure Functions, Azure Data Lake, e mais, para construir pipelines de processamento de dados completos.
Estrutura do Azure Event Hubs
- Namespace: Um contêiner de nível superior para um ou mais Event Hubs.
- Event Hub: Um fluxo de dados de eventos dentro do namespace, semelhante a um tópico em sistemas de mensagens.
- Partitions: Subdivisões de um Event Hub que permitem a ingestão paralela e independente de eventos.
- Consumer Groups: Múltiplos grupos de consumidores podem ler do mesmo Event Hub, cada um com sua própria posição de leitura.
Como Funciona?
- Produtores (Producers): Enviam dados para o Event Hub. Podem ser aplicativos, dispositivos, ou qualquer sistema que produza eventos.
- Event Hubs: Recebe e armazena eventos, distribuindo-os em várias partições para escalabilidade.
- Consumidores (Consumers): Aplicações ou serviços que leem os eventos do Event Hub. Eles podem processar, analisar, ou armazenar os dados conforme necessário.
- Processamento e Armazenamento: Dados consumidos podem ser processados em tempo real (por exemplo, usando Azure Stream Analytics) ou armazenados para análise posterior (por exemplo, em Azure Data Lake ou Azure SQL Database).
O Azure Event Hubs é uma solução poderosa para lidar com grandes volumes de dados em tempo real, oferecendo escalabilidade, segurança e integração com outros serviços do Azure. Ele é ideal para cenários que exigem ingestão rápida e processamento paralelo de dados, permitindo que organizações transformem grandes quantidades de dados em insights valiosos rapidamente.
Passo 1: Configuração do Ambiente
Antes de começar, certifique-se de ter as seguintes dependências instaladas:
npm install @azure/identity @azure/event-hubs
OBS: Caso precise ver os Passos 1 ao 3 veja o artigo anterior sobre o tema:
Como Configurar o Azure Blob Service Client Aplicando os Princípios SOLID em uma Azure Function com…
Passo 4: Arquitetura com Provedores de Credenciais
Vamos criar uma fábrica para instanciar o EventHubProducerClient usando nosso CredentialProvider.
import { EventHubProducerClient } from "@azure/event-hubs";
/**
* Fábrica para criar instâncias do EventHubProducerClient.
*/
class EventHubProducerClientFactory {
private fullyQualifiedNamespace: string;
private eventHubName: string;
private credentialProvider: CredentialProvider;
/**
* Cria uma nova instância do EventHubProducerClientFactory.
* @param {string} fullyQualifiedNamespace - O namespace totalmente qualificado do Azure Event Hub.
* @param {string} eventHubName - O nome do Event Hub.
* @param {CredentialProvider} credentialProvider - O provedor de credenciais a ser utilizado.
*/
constructor(fullyQualifiedNamespace: string, eventHubName: string, credentialProvider: CredentialProvider) {
this.fullyQualifiedNamespace = fullyQualifiedNamespace;
this.eventHubName = eventHubName;
this.credentialProvider = credentialProvider;
}
/**
* Cria uma instância do EventHubProducerClient.
* @returns {EventHubProducerClient} Uma instância do EventHubProducerClient configurada.
*/
createEventHubProducerClient(): EventHubProducerClient {
const credential = this.credentialProvider.getCredential();
return new EventHubProducerClient(this.fullyQualifiedNamespace, this.eventHubName, credential);
}
}
Passo 5: Utilizando a Fábrica em uma Azure Function
Vamos integrar tudo isso em uma Azure Function, mostrando cada método de autenticação.
Exemplo 1: Azure Function com Managed Identity Atribuída ao Sistema
import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { EventHubProducerClientFactory } from "./EventHubProducerClientFactory";
import { SystemAssignedManagedIdentityCredentialProvider } from "./SystemAssignedManagedIdentityCredentialProvider";
/**
* Azure Function utilizando Managed Identity atribuída ao Sistema.
* @param {Context} context - O contexto da função.
* @param {HttpRequest} req - A requisição HTTP.
* @returns {Promise<void>} Uma promessa que resolve quando a função é concluída.
*/
const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const fullyQualifiedNamespace = process.env.AZURE_EVENTHUB_FULLYQUALIFIEDNAMESPACE;
const eventHubName = "EVENT_HUB_NAME";
const credentialProvider = new SystemAssignedManagedIdentityCredentialProvider();
const producerClientFactory = new EventHubProducerClientFactory(fullyQualifiedNamespace, eventHubName, credentialProvider);
const producerClient = producerClientFactory.createEventHubProducerClient();
// Utilize o producerClient para enviar eventos para o Event Hub
context.res = {
body: "Azure Function utilizando Managed Identity atribuída ao Sistema para Acesso ao Event Hub"
};
};
export default httpTrigger;
Exemplo 2: Azure Function com Managed Identity Atribuída ao Usuário
import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { EventHubProducerClientFactory } from "./EventHubProducerClientFactory";
import { UserAssignedManagedIdentityCredentialProvider } from "./UserAssignedManagedIdentityCredentialProvider";
/**
* Azure Function utilizando Managed Identity atribuída ao Usuário.
* @param {Context} context - O contexto da função.
* @param {HttpRequest} req - A requisição HTTP.
* @returns {Promise<void>} Uma promessa que resolve quando a função é concluída.
*/
const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const fullyQualifiedNamespace = process.env.AZURE_EVENTHUB_FULLYQUALIFIEDNAMESPACE;
const eventHubName = "EVENT HUB NAME";
const clientId = process.env.AZURE_EVENTHUB_CLIENTID;
const credentialProvider = new UserAssignedManagedIdentityCredentialProvider(clientId);
const producerClientFactory = new EventHubProducerClientFactory(fullyQualifiedNamespace, eventHubName, credentialProvider);
const producerClient = producerClientFactory.createEventHubProducerClient();
// Utilize o producerClient para enviar eventos para o Event Hub
context.res = {
body: "Azure Function utilizando Managed Identity atribuída ao Usuário para Acesso ao Event Hub"
};
};
export default httpTrigger;
Exemplo 3: Azure Function com Service Principal
import { AzureFunction, Context, HttpRequest } from "@azure/functions";
import { EventHubProducerClientFactory } from "./EventHubProducerClientFactory";
import { ServicePrincipalCredentialProvider } from "./ServicePrincipalCredentialProvider";
/**
* Azure Function utilizando Service Principal.
* @param {Context} context - O contexto da função.
* @param {HttpRequest} req - A requisição HTTP.
* @returns {Promise<void>} Uma promessa que resolve quando a função é concluída.
*/
const httpTrigger: AzureFunction = async function (context: Context, req: HttpRequest): Promise<void> {
const fullyQualifiedNamespace = process.env.AZURE_EVENTHUB_FULLYQUALIFIEDNAMESPACE;
const eventHubName = "EVENT HUB NAME";
const tenantId = process.env.AZURE_EVENTHUB_TENANTID;
const clientId = process.env.AZURE_EVENTHUB_CLIENTID;
const clientSecret = process.env.AZURE_EVENTHUB_CLIENTSECRET;
const credentialProvider = new ServicePrincipalCredentialProvider(tenantId, clientId, clientSecret);
const producerClientFactory = new EventHubProducerClientFactory(fullyQualifiedNamespace, eventHubName, credentialProvider);
const producerClient = producerClientFactory.createEventHubProducerClient();
// Utilize o producerClient para enviar eventos para o Event Hub
context.res = {
body: "Azure Function utilizando Service Principal para Acesso ao Event Hub"
};
};
export default httpTrigger;
Conclusão
Parabéns! Você configurou com sucesso o Azure Event Hub utilizando várias técnicas de autenticação em Azure Functions, aplicando as melhores práticas de mercado. Nossa abordagem modular facilita a manutenção e a extensão do código. 🎉
Referências
Início Rápido – Criar uma conexão de serviço no aplicativo de funções por meio do portal do Azure