Banco de Dados

8 jul, 2026

Processamento Transacional e Analítico Híbrido (HTAP): Erradicação de Pipelines ETL com Azure Synapse Link e Cosmos DB

Publicidade

Pipelines de dados tradicionais (ETL) introduzem um abismo temporal inaceitável entre o momento em que uma transação ocorre no banco de dados operacional e o instante em que essa informação se torna visível para algoritmos analíticos. Tentativas de reduzir essa latência sondando bancos de dados relacionais ativamente destroem o rendimento transacional (OLTP) devido a bloqueios de tabela e exaustão de CPU. A construção de malhas de mensageria complexas para contornar esse estrangulamento exige manutenção contínua e gera dívida técnica massiva. A adoção da arquitetura de Processamento Transacional e Analítico Híbrido (HTAP) através do Azure Synapse Link para Azure Cosmos DB erradica essas deficiências de forma sistêmica. Ao habilitar o Analytical Store, a infraestrutura da Microsoft particiona os dados fisicamente nos bastidores, mantendo um armazenamento orientado a linhas para a aplicação em milissegundos e um armazenamento colunar otimizado para agregações analíticas. Essa topologia permite que cargas de trabalho analíticas pesadas consultem dados operacionais em tempo quase real sem consumir uma única Unidade de Solicitação (RU/s) do provisionamento transacional.

Pré-requisitos

O provisionamento desta fundação de dados exige domínio profundo sobre modelagem NoSQL e motores de processamento massivamente paralelos (MPP). A infraestrutura deve ser codificada deterministicamente através do Terraform versão 1.7.0 ou superior acoplado ao provedor HashiCorp AzureRM versão 3.90.0 ou superior. A camada de ingestão requer o Python 3.12 com o SDK azure-cosmos (versão 4.3.0), enquanto a camada analítica utilizará a API PySpark (versão 3.4) dentro do Azure Synapse Analytics. Privilégios administrativos na assinatura do Azure são mandatórios para habilitar a rede gerenciada do Synapse Workspace e autorizar a travessia de dados corporativos.

Passo a Passo

Provisionamento do Repositório Dual (Row e Column Store)

A fundação do padrão HTAP exige o provisionamento de um banco de dados NoSQL com suporte explícito ao espelhamento colunar automático. Configuramos uma conta do Azure Cosmos DB e instanciamos contêineres ativando a propriedade analytical_storage_enabled. A justificativa arquitetônica vital reside na separação magnética de cargas de trabalho. Por padrão, o Cosmos DB armazena documentos em um formato orientado a linhas (Row Store) indexado, o que entrega leituras e gravações pontuais eficientes para a aplicação. Contudo, varrer milhões de linhas para calcular médias financeiras consome recursos computacionais proibitivos. Ao habilitar o armazenamento analítico, a infraestrutura abstrai um processo de sincronização invisível que extrai inserções, atualizações e exclusões da camada transacional e as converte em formato de colunas (Parquet) em um espaço de armazenamento paralelo. Este processo ocorre autonomamente, não compete pelos recursos de provisionamento do banco principal e não penaliza a latência da API do cliente.

resource "azurerm_cosmosdb_account" "htap_account" {
  name                = "cosmos-enterprise-htap"
  location            = var.location
  resource_group_name = var.resource_group_name
  offer_type          = "Standard"
  kind                = "GlobalDocumentDB"

  consistency_policy {
    consistency_level = "Session"
  }

  geo_location {
    location          = var.location
    failover_priority = 0
  }

  # Habilita globalmente o recurso do Synapse Link na conta
  enable_analytical_storage = true
}

resource "azurerm_cosmosdb_sql_database" "commerce_db" {
  name                = "CommerceDB"
  resource_group_name = azurerm_cosmosdb_account.htap_account.resource_group_name
  account_name        = azurerm_cosmosdb_account.htap_account.name
}

resource "azurerm_cosmosdb_sql_container" "orders_container" {
  name                  = "Orders"
  resource_group_name   = azurerm_cosmosdb_account.htap_account.resource_group_name
  account_name          = azurerm_cosmosdb_account.htap_account.name
  database_name         = azurerm_cosmosdb_sql_database.commerce_db.name
  partition_key_paths   = ["/tenantId"]
  partition_key_version = 2
  
  # Tempo de retenção do dado transacional (Row Store) em segundos (-1 = infinito)
  default_ttl = -1
  
  # Tempo de retenção analítico (Column Store) isolado
  analytical_storage_ttl = -1
}

Como injetamos o fluxo contínuo de transações de negócios neste contêiner garantindo que os schemas dinâmicos não quebrem a estrutura colunar gerada nos bastidores pelo motor do Azure?

Ingestão Transacional e Evolução de Esquema (Schema Inference)

A ingestão de dados (OLTP) ocorre de forma nativa e agnóstica à existência da camada analítica, utilizando o SDK padrão do Cosmos DB. A aplicação escreve documentos JSON com estruturas variadas, aderindo ao princípio de schema-less do NoSQL. O raciocínio técnico que permite a transformação matemática desses documentos amorfos em colunas tipadas é a Inferência Rígida de Esquema (Schema Inference) integrada ao Synapse Link. O motor do Azure varre as propriedades dos documentos e cria colunas no armazenamento analítico. Se a aplicação enviar um número inteiro para o campo total_amount e, posteriormente, enviar uma string para o mesmo campo, o motor HTAP criará duas colunas distintas no formato colunar (exemplo: total_amount_int64 e total_amount_string), prevenindo a falha do pipeline e permitindo que os engenheiros de dados resolvam a anomalia através de transformações (casting) durante o momento da consulta.

import os
import uuid
import time
import logging
from typing import Dict, Any
from azure.cosmos import CosmosClient, PartitionKey
from azure.identity import DefaultAzureCredential

logger = logging.getLogger("OltpAdapter")

class TransactionalIngestionAdapter:
    def __init__(self, endpoint: str):
        credential = DefaultAzureCredential()
        self.client = CosmosClient(endpoint, credential=credential)
        self.database = self.client.get_database_client("CommerceDB")
        self.container = self.database.get_container_client("Orders")

    def record_sale(self, tenant_id: str, amount: float, items: list) -> None:
        document_id = str(uuid.uuid4())
        
        # O documento é persistido em milissegundos no Row Store.
        # A infraestrutura do Azure o projetará no Column Store em menos de 2 minutos.
        payload = {
            "id": document_id,
            "tenantId": tenant_id,
            "amount": amount,
            "items": items,
            "transaction_timestamp": int(time.time()),
            "status": "COMPLETED"
        }
        
        self.container.create_item(body=payload)
        logger.info(f"Transação {document_id} registrada no armazenamento OLTP.")

adapter = TransactionalIngestionAdapter(os.environ["COSMOS_ENDPOINT"])
adapter.record_sale("tenant_alpha", 1500.50, [{"sku": "NTBK-01", "qty": 1}])

Uma vez que a barreira do ETL foi abolida e os dados operacionais estão disponíveis no formato de colunas, como instanciamos a computação em nuvem para processar petabytes dessa informação e extrair valor analítico sem provisionar clusters inativos 24 horas por dia?

Análise Massiva com Pools Spark Efêmeros (Synapse Workspace)

Executamos as cargas analíticas instanciando Notebooks e Pools do Apache Spark diretamente dentro do Azure Synapse Analytics, conectando-os ao Cosmos DB Analytical Store. A arquitetura exige um Serviço Vinculado (Linked Service) que estabelece uma rota direta entre o Synapse Workspace e o Cosmos DB usando identidades gerenciadas. O raciocínio vital reside no isolamento de cobrança e performance. O código PySpark abaixo executa agregações complexas sobre todos os pedidos registrados. Ele lê diretamente dos arquivos Parquet subjacentes ao Cosmos DB (Analytical Store). A transação nunca acessa os índices transacionais e, portanto, não consome RU/s. Adicionalmente, os Pools do Spark no Synapse são efêmeros e configurados com pausa automática (auto-pause); eles despertam, processam os dados operacionais da última hora e hibernam, cobrando exclusivamente pelos minutos de computação efetivamente utilizados na agregação.

# Código executado em um Notebook PySpark dentro do Azure Synapse Analytics
from pyspark.sql.functions import col, sum, window
import time

# O Linked Service gerencia a autenticação subjacente
cosmos_format = "cosmos.olap"
linked_service_name = "CosmosDbHtapLink"
database_name = "CommerceDB"
container_name = "Orders"

print("Iniciando leitura massiva diretamente do Analytical Store (sem consumo de RU/s)...")

# A leitura aponta para a engine OLAP integrada
df = spark.read.format(cosmos_format) \
    .option("spark.synapse.linkedService", linked_service_name) \
    .option("spark.cosmos.container", container_name) \
    .load()

# Agregação de alto desempenho processada na memória do cluster Spark
# Analisando o volume total de vendas por Tenant 
agg_df = df.filter(col("status") == "COMPLETED") \
    .groupBy("tenantId") \
    .agg(sum("amount").alias("TotalRevenue"))

agg_df.show()

# Opcionalmente, o resultado limpo pode ser gravado no Azure Data Lake (Parquet)
# para consumo por ferramentas de Business Intelligence como Power BI.

Se o banco de dados principal acumular dados eternamente, as faturas de armazenamento crescerão proporcionalmente, mas excluir registros antigos da aplicação apagará o histórico das ferramentas de BI. Como projetamos o ciclo de vida da informação para proteger o modelo analítico e, simultaneamente, reduzir os custos operacionais?

Governança e Ciclo de Vida Assíncrono (ATTL vs TTTL)

Resolvemos o conflito de retenção dissociando matematicamente o tempo de vida transacional (TTTL) do tempo de vida analítico (ATTL). O Azure Cosmos DB HTAP permite que a engenharia configure limites independentes de expiração no nível do contêiner. O raciocínio arquitetônico foca na otimização de custo de armazenamento dinâmico (Hot Storage). A aplicação front-end raramente consulta transações com mais de 90 dias de idade diretamente da API principal. Portanto, o Terraform é atualizado para configurar o default_ttl (Transactional Time-to-Live) para 7776000 segundos (90 dias). Ao mesmo tempo, configuramos o analytical_storage_ttl para -1 (infinito) ou para um período regulatório longo, como 5 anos. Quando o registro completa 90 dias, o motor OLTP o expurga silenciosamente do índice de linhas, recuperando capacidade de disco caro. Contudo, o registro permanece intacto no armazenamento colunar mais barato (Analytical Store). Isso protege o histórico para modelos de Machine Learning no Synapse, otimizando o orçamento de nuvem sem exigir a movimentação manual de dados (arquivamento em fita).

Solução de Problemas Comuns

Uma obstrução crônica na integração de Synapse Workspaces com o Cosmos DB protegido (VNet restrita) manifesta-se através de exceções 403 Forbidden nos Notebooks Spark durante a tentativa de leitura. Isso acontece independentemente de a Identidade Gerenciada do Synapse ter sido adicionada à função Cosmos DB Built-in Data Contributor. A anomalia reside na incapacidade do Synapse Serverless (ou Spark) de atravessar o firewall do Cosmos DB pela internet pública se a regra “Allow Access from Azure Services” estiver desativada e um Private Endpoint não tiver sido configurado. A mitigação técnica obriga o provisionamento de um Managed Private Endpoint especificamente dentro do Synapse Studio, apontando para o Azure Cosmos DB. Após a criação, um administrador deve aprovar manualmente a conexão privada no portal do Cosmos DB para selar a comunicação pelo backbone fechado da rede da Microsoft.

Outra deficiência analítica surge quando agregações Spark retornam contagens inconsistentes logo após picos agressivos de gravação. O engenheiro notará que transações registradas há dez segundos não aparecem no dataframe agregado. Essa condição é um comportamento arquitetônico intencional (by design). O processo de isolamento entre o Row Store e o Column Store não é síncrono. Existe um atraso autônomo e não configurável de até cinco minutos (frequentemente concluído em menos de dois) operado pela Microsoft para agrupar e converter os documentos JSON em colunas Parquet de forma eficiente. O sistema entrega quase-tempo real (Near Real-Time). Arquiteturas que demandam gatilhos de latência sub-segundo devem recorrer ao Change Feed (OLTP) acoplado a Azure Functions, reservando o Synapse Link (OLAP) exclusivamente para descobertas massivas de dados que suportem tolerância temporal na casa dos minutos.

Conclusão

A arquitetura de Processamento Transacional e Analítico Híbrido substitui a complexidade imperativa da construção de pipelines ETL pela abstração declarativa da plataforma em nuvem. Isolar os motores de processamento enquanto a camada de armazenamento subjacente se sincroniza autonomamente assegura que a exploração científica de dados não exija refatorações agressivas no domínio transacional. Esta topologia encurta o ciclo de vida do desenvolvimento de dados operacionais. Em ecossistemas multicloud em evolução corporativa, o padrão conceitual HTAP espelha a funcionalidade oferecida pelo AWS Supernova (Amazon Aurora integrando-se sem limites ao Amazon Redshift Zero-ETL), consolidando a convergência universal entre as frentes de negócios e a inteligência corporativa.