Pular para o conteúdo principal

DOC-010 — Visão Geral de Arquitetura

Arquitetura de alto nível

O Ladesa adota uma arquitetura de microsserviços desacoplados conectados por mensageria assíncrona, com um frontend unificado que serve ambos os sistemas (SISGHA e SISGEA).

┌────────────────────────────────────────────────────────────────────┐
│ CLIENTES │
│ │
│ ┌──────────┐ ┌──────────────┐ │
│ │ Web │ │ Mobile │ │
│ │ (Nuxt 4) │ │ (Flutter) │ │
│ └────┬─────┘ └──────┬───────┘ │
│ │ │ │
│ └──────┬───────────┘ │
│ │ HTTPS │
├──────────────┼──────────────────────────────────────────────────────┤
│ ▼ BACKEND │
│ ┌─────────────────────┐ │
│ │ Keycloak 25.0 │◄─── SSO / OAuth2 / OIDC │
│ │ (authentication) │ │
│ └─────────────────────┘ │
│ │ │
│ ┌─────────────────────┐ ┌──────────┐ ┌──────────────────┐│
│ │ management-service │◄───►│ RabbitMQ │◄───►│ timetable-gen. ││
│ │ (NestJS + Bun) │ │ (fila) │ │ (C# + OR-Tools) ││
│ └────────┬────────────┘ └──────────┘ └──────────────────┘│
│ │ │
│ ┌────────┴────────┐ │
│ │ PostgreSQL 15 │ ┌───────┐ │
│ │ (persistência) │ │ Redis │ (cache) │
│ └─────────────────┘ └───────┘ │
├────────────────────────────────────────────────────────────────────┤
│ INFRAESTRUTURA │
│ Docker → Kubernetes │
└────────────────────────────────────────────────────────────────────┘

Decisões arquiteturais

Cada decisão técnica está documentada como um ADR (Architecture Decision Record) nesta seção:

ADRDecisãoMotivação principal
ADR-001Frontend unificado Nuxt para SISGHA + SISGEAReutilização de componentes, UX consistente
ADR-002NestJS + Bun no backendPerformance + ecossistema TypeScript
ADR-003Google OR-Tools CP-SAT como solverSolver open-source de referência para timetabling
ADR-004TypeSpec para contratos inter-serviçoType-safety entre serviços, geração de código
ADR-005Keycloak 25.0 para SSOPadrão open-source, suporte OIDC, federação
ADR-006RabbitMQ para mensageria assíncronaDesacoplamento do solver, retry nativo
ADR-007JSONB para contrato com o solverFlexibilidade durante evolução do contrato
ADR-008Flutter para app mobileMultiplataforma, performance nativa, tema dinâmico

Princípios arquiteturais

  1. Desacoplamento via mensageria: o timetable-generator não conhece o management-service diretamente — comunicação exclusivamente via fila RabbitMQ.
  2. Frontend unificado: SISGHA e SISGEA compartilham a mesma aplicação Nuxt, com rotas e layouts separados por sistema.
  3. Soft delete universal: nenhuma entidade é excluída fisicamente — campo date_deleted em todas as tabelas.
  4. UUID como identificador: todas as entidades usam UUID v4, eliminando conflitos de ID entre ambientes.
  5. Geração assíncrona: a geração de horário é um background job — o usuário não fica bloqueado esperando o solver.

Fonte: Repositórios GitHub ladesa-ro, artefatos/modelagem/LADESA.sql, relatório NotebookLM Seção 11.