📚 Pré-requisitos Teóricos: este projeto aplica conceitos ensinados em Módulo 08: Bancos de Dados SQL e NoSQL. Recomendado revisar antes de começar.

🌐 Persistência Poliglota Integrada & Gestão Logística Enterprise

v1.0 — Arquitetura Multimodelo: PostgreSQL (ACID) + MongoDB (Eventos) + Redis (Cache)

Trilha de Engenharia de Dados & Bancos de Dados — Projeto 10 de 10

🎓 Nível Profissional Simulado: Principal Data Architect / Staff Engineer. Em grandes plataformas de e-commerce e logística (Mercado Livre, Amazon), tentar forçar todos os tipos de dados em um único banco relacional resulta em falha de escala. A Persistência Poliglota direciona cada requisito para o motor com máxima afinidade natural.


🎯 Objetivo

Arquitetar e implementar uma plataforma corporativa de Persistência Poliglota unindo PostgreSQL 16 (integridade financeira e faturas ACID), MongoDB 7.0 (histórico flexível de checkpoints com coordenadas GPS) e Redis 7.2 (cache volátil de localização e status em tempo real para dispositivos móveis).


🏗️ Diagrama de Arquitetura Poliglota

flowchart LR
    classDef client fill:#1E293B,stroke:#0EA5E9,stroke-width:2px,color:#fff;
    classDef api fill:#0F172A,stroke:#38BDF8,stroke-width:2px,color:#fff;
    classDef sql fill:#1E3A8A,stroke:#3B82F6,stroke-width:2px,color:#fff;
    classDef doc fill:#064E3B,stroke:#10B981,stroke-width:2px,color:#fff;
    classDef mem fill:#7F1D1D,stroke:#EF4444,stroke-width:2px,color:#fff;

    App["📱 App do Entregador & Painel Web"]:::client
    API["⚙️ Orquestrador de Logística"]:::api

    App <--> API

    API -->|1. Faturas & Fretes| SQL["🐘 PostgreSQL 16<br/>(Transações ACID)"]:::sql
    API -->|2. Checkpoints & GPS| MONGO["🍃 MongoDB 7.0<br/>(JSON Dinâmico)"]:::doc
    API -->|3. Status em Tempo Real| REDIS["⚡ Redis 7.2<br/>(Cache em Memória)"]:::mem

🧑‍💼 Fase 1 — Levantamento de Requisitos

O Briefing do Cliente (Diretoria de Tecnologia & Logística)

“Nossa transportadora entrega 100.000 encomendas por dia. O sistema antigo tentava gravar os pings de GPS dos motoristas no PostgreSQL, travando o faturamento e a emissão de notas fiscais. Queremos separar as coisas: notas e valores financeiros no PostgreSQL; o histórico de paradas com latitude/longitude no MongoDB; e o status da entrega para o cliente consultar no aplicativo direto no Redis em sub-milissegundo.”

Requisitos Funcionais (RF) e Não-Funcionais (RNF)

ID Tipo Descrição Origem no Briefing
RF01 Funcional Persistir pedidos e faturas financeiras no PostgreSQL com garantia ACID. “notas e valores no PostgreSQL”
RF02 Funcional Gravar eventos de checkpoints com cidades e coordenadas no MongoDB. “histórico de paradas com latitude/longitude”
RF03 Funcional Disponibilizar status instantâneo via Redis para o aplicativo mobile. “consultar no app em sub-milissegundo”
RNF01 Não-Funcional Desacoplamento de falha: lentidão na gravação de GPS não deve impactar o faturamento. Resiliência de Arquitetura
RNF02 Não-Funcional Consistência eventual coordenada entre as camadas de dados. Integridade Distribuída

📋 Fase 2 — Backlog & User Stories

ID User Story Prioridade
US01 Como cliente, quero rastrear minha encomenda no aplicativo sem lentidão via cache Redis. Alta
US02 Como motorista, quero registrar checkpoints de entrega salvando rotas dinâmicas no MongoDB. Alta
US03 Como diretor financeiro, quero garantir que nenhuma fatura seja corrompida no PostgreSQL. Alta

🌿 Fase 3 — Engenharia em Equipe (Git Flow & Setup)

# Branch da funcionalidade
git checkout -b feature/US01-polyglot-persistence

# Subir todo o ecossistema integrado (Postgres + Mongo + Redis)
docker-compose up -d

# Validar se os 3 containers estão saudáveis
docker ps

🛠️ Fase 4 — Implementação Passo a Passo (app/logistica_orchestrator.py)

class LogisticaPoliglotaOrchestrator:
    def __init__(self):
        self.postgres_faturas = {}
        self.mongo_checkpoints = {}
        self.redis_cache = {}

    def criar_pedido_entrega(self, codigo_rastreio, remetente_id, destinatario, frete):
        # 1. PostgreSQL (ACID)
        self.postgres_faturas[codigo_rastreio] = {"frete": frete, "status": "PAGO"}
        # 2. Redis (Cache)
        self.redis_cache[codigo_rastreio] = {"status": "CRIADO"}

    def registrar_checkpoint(self, codigo_rastreio, evento, cidade, uf):
        # 3. MongoDB (Documento livre)
        self.mongo_checkpoints[codigo_rastreio].append({"evento": evento, "cidade": cidade})
        self.redis_cache[codigo_rastreio]["status"] = evento

🧭 Decisões Técnicas (ADRs)


🚀 Como Executar no Laboratório

1. Abra o terminal na pasta deste projeto

No seu editor/IDE, abra a pasta deste projeto (File > Open Folder) ou navegue via terminal:

cd db_poliglota_10_logistica_integrada

2. Execute a aplicação ou testes

docker-compose up -d
# Executar a suíte de testes automatizados de integração:
python -m unittest tests/test_poliglota_integrada.py

[!TIP] Dica para execução a partir da raiz do repositório: Se você abriu o repositório completo no VS Code, basta navegar até a pasta antes de executar: cd catalogo_projetos/db_poliglota_10_logistica_integrada


🧪 Testes de Validação & Asserções

# Executar suíte de integração poliglota
python -m unittest tests/test_poliglota_integrada.py


🏛️ Arquitetura Visual & Engenharia de Dados

A arquitetura abaixo demonstra o fluxo de persistência, otimização e isolamento dos componentes na subpasta app/:

Arquitetura do Banco de Dados

flowchart TD
    subgraph DDL["Modelagem & Schema (DDL)"]
        S1["Tabelas / Coleções"] --> S2["Constraints & Índices"]
    end
    subgraph DML["Regras & Automação (DML / PL)"]
        R1["Triggers / Aggregations"] --> R2["Procedimentos Transacionais"]
    end
    subgraph Perf["Otimização & Armazenamento"]
        P1["Planos EXPLAIN / Partições"] --> P2["Garantia de ACID / TTL"]
    end
    subgraph Homolog["Homologação & Qualidade"]
        Q1["Docker Compose & Scripts"] --> Q2["Checkpoints CP-01..05 PASS"]
    end

    DDL --> DML
    DML --> Perf
    Perf --> Homolog

    style DDL fill:#e3f2fd,stroke:#1976d2,stroke-width:1.5px
    style DML fill:#fffde7,stroke:#fbc02d,stroke-width:1.5px
    style Perf fill:#e8f5e9,stroke:#388e3c,stroke-width:1.5px
    style Homolog fill:#f3e5f5,stroke:#7b1fa2,stroke-width:1.5px

🎯 Engenharia de Requisitos & Modelagem Formal

👤 User Stories (Histórias de Usuário)

ID Persona História de Usuário Critério de Aceite Prioridade
US-01 Arquiteto de Soluções Desejo persistência poliglota selecionando o banco certo para cada caso PostgreSQL para financeiro/ACID, MongoDB para notas/documentos e Redis para tracking Alta
US-02 Engenheiro de Logística Desejo atualizar status de entregas em tempo real com Redis Pub/Sub e chaves voláteis Tracking instantâneo de frotas com latência sub-milissegundo Alta
US-03 Desenvolvedor de Backend Desejo armazenar romaneios e notas fiscais XML/JSON no MongoDB Documentos flexíveis suportando diferentes layouts de frete e transportadoras Alta
US-04 Operador Financeiro Desejo fechamento de faturamento e concorrência estrita no PostgreSQL Garantia ACID de contas a pagar e receber vinculadas a fretes concluídos Alta
US-05 Auditor de Integração Desejo suíte de testes de ponta a ponta validando consistência entre os 3 bancos Testes automatizados cobrindo o ciclo completo da entrega Média

⚙️ Requisitos Funcionais (RF)

ID Descrição do Requisito Criticidade
RF-01 Orquestração de microsserviço integrando PostgreSQL, MongoDB e Redis Alta
RF-02 Persistência transacional financeira no PostgreSQL com isolamento estrito Alta
RF-03 Armazenamento documental de remessas e manifestos de carga no MongoDB Alta
RF-04 Telemetria de rastreamento de localização e fila de eventos no Redis Alta
RF-05 Ambiente multi-contêiner no Docker Compose e testes integrados em app/ Média

🛡️ Requisitos Não-Funcionais (RNF)

ID Especificação Arquitetural Criticidade
RNF-01 Consistência eventual robusta entre a camada de cache e a base transacional Alta
RNF-02 Tolerância a particionamento de rede com retries assíncronos Alta
RNF-03 Subida unificada de todos os serviços com um único comando docker-compose up Média
RNF-04 Código desacoplado por adaptadores de repositório em Python Média
RNF-05 Organização modular dos componentes na subpasta app/ Alta

🔗 Matriz de Rastreabilidade (RTM)

User Story Requisito Funcional Requisito Não-Funcional Módulo / Artefato de Código Status de Homologação
US-01 RF-01 RNF-03, RNF-04 app/main.py Testado
US-02 RF-04 RNF-01, RNF-04 app/tracking_redis.py Testado
US-03 RF-03 RNF-02, RNF-04 app/manifesto_mongo.py Testado
US-04 RF-02 RNF-01, RNF-04 app/faturamento_postgres.py Testado
US-05 RF-05 RNF-01, RNF-05 tests/test_poliglota.py Testado

🏁 Checkpoints de Qualidade & Homologação

Checkpoint Escopo da Validação Artefato Verificado Status
CP-01 Subida Conteinerizada do Ambiente docker-compose.yml PASS ✅
CP-02 Criação de Estrutura & Schemas app/ PASS ✅
CP-03 Automação Transacional & Regras Triggers / Queries PASS ✅
CP-04 Otimização de Performance & Índices Indexes / Tuning PASS ✅
CP-05 Homologação com Suíte de Testes tests/ PASS ✅