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
- Leitura Veloz de Memória: O carrinho é resgatado do Redis sem onerar o banco relacional principal.
- Transação ACID no PostgreSQL: Apenas quando a compra é de fato confirmada o banco transacional entra em ação com
BEGIN/COMMIT. - 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
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto