Pular para conteúdo

Aula 20 - Projeto Capstone: Arquitetura Poliglota de Persistência 🏆

Objetivo Pedagógico

Objetivo: Construção de uma arquitetura corporativa com Persistência Poliglota, integrando o banco de dados ideal para cada caso de uso: PostgreSQL (Transacional), MongoDB (Catálogo) e Redis (Sessões e Cache).


📑 1. Fundamentos Teóricos & Análise Técnica

O Projeto Capstone de Especialização em Bancos de Dados NoSQL consolida a compreensão madura de que não existe um banco de dados universal perfeito para todos os cenários. Em arquiteturas corporativas de alta escala, o padrão Polyglot Persistence (Persistência Poliglota) dita que cada subsistema utilize o motor de banco de dados mais adequado para a natureza dos seus dados:

O projeto avalia a integração de três subsistemas especializados em uma Plataforma de E-Commerce Global: 1. Catálogo de Produtos Dinâmico com MongoDB: Documentos com esquemas flexíveis para suportar atributos variados de diferentes categorias de produtos (eletrônicos, vestuário, livros) e buscas com agregação. 2. Camada de Carrinho e Sessões Rápidas com Redis: Chaves voláteis em memória com TTL de 30 minutos e contadores atômicos de estoque. 3. Liquidação Financeira e Pedidos com PostgreSQL: Transações financeiras estritas com garantias ACID e emissão de notas fiscais. 4. Sincronização de Dados Assíncrona: Coordenação de eventos de alteração de catálogo e estoque sem acoplamento direto.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph TD
    Client["Cliente Web / App"] --> Gateway["API Gateway"]
    Gateway -->|Busca de Catálogo (Flexível)| Mongo["MongoDB (Produtos & Variantes)"]
    Gateway -->|Carrinho & Sessão (< 1ms)| Redis["Redis (Memória Temporária)"]
    Gateway -->|Checkout & Pagamento (ACID)| Postgres["PostgreSQL (Faturamento & Livro-Razão)"]
    style Client fill:#e1f5fe,stroke:#01579b
    style Gateway fill:#fff3e0,stroke:#e65100
    style Mongo fill:#e8f5e9,stroke:#2e7d32
    style Redis fill:#ffebee,stroke:#c62828
    style Postgres fill:#f3e5f5,stroke:#7b1fa2

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Uso Correto de Ferramentas: Cada banco resolve estritamente o problema para o qual foi desenhado. - Consistência Híbrida: Consistência forte (ACID) onde há dinheiro envolvido; consistência eventual onde a velocidade de catálogo é prioridade. - Resiliência de Falhas: A queda temporária do motor de catálogo não impede a consulta de status de pedidos anteriores. - Eficiência de Custos: Economia de licenças e recursos de computação ao não sobrecarregar bancos relacionais com cache temporário.


🛠️ 2. Implementação Prática em NoSQL Poliglota (MongoDB, Redis, PostgreSQL)

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// polyglot_coordinator.ts (Coordenação entre Redis e PostgreSQL no Checkout)
import { Redis } from 'ioredis';
import { Pool } from 'pg';

const redis = new Redis();
const pgPool = new Pool({ connectionString: process.env.DATABASE_URL });

export async function processCheckout(userId: string, cartId: string) {
  // 1. Obtém os itens do carrinho instantaneamente da memória (Redis)
  const cartItems = await redis.hgetall(`cart:${cartId}`);
  if (!cartItems || Object.keys(cartItems).length === 0) {
    throw new Error('Carrinho vazio ou expirado.');
  }

  // 2. Transação ACID rigorosa no PostgreSQL para gravação do pedido financeiro
  const client = await pgPool.connect();
  try {
    await client.query('BEGIN');

    const insertOrderRes = await client.query(
      'INSERT INTO orders (user_id, status) VALUES ($1, $2) RETURNING id',
      [userId, 'CONFIRMED']
    );
    const orderId = insertOrderRes.rows[0].id;

    // Grava histórico
    await client.query('COMMIT');

    // 3. Purga o carrinho temporário do Redis
    await redis.del(`cart:${cartId}`);
    return { orderId, status: 'SUCCESS' };
  } catch (error) {
    await client.query('ROLLBACK');
    throw error;
  } finally {
    client.release();
  }
}

💡 Análise Passo a Passo do Código

  1. Leitura Veloz de Memória: O carrinho é resgatado do Redis sem onerar o banco relacional principal.
  2. Transação ACID no PostgreSQL: Apenas quando a compra é de fato confirmada o banco transacional entra em ação com BEGIN/COMMIT.
  3. Desalocação do Cache: Após o sucesso da transação relacional, o Redis limpa os dados temporários com del.

🎯 3. Próximos Passos & Sequência Didática