Arquitectura
Arquitectura General
Visión general de la arquitectura del ecosistema ParkVision. Componentes, comunicación y flujo de datos.
Arquitectura General
ParkVision es un sistema distribuido compuesto por múltiples servicios que trabajan juntos para proporcionar gestión inteligente de estacionamientos.
Componentes principales
1. Parking.API (.NET 8)
El backend principal del sistema. Implementa Clean Architecture con los siguientes proyectos:
- Parking.Domain: Entidades del dominio
- Parking.Application: Lógica de negocio con CQRS (MediatR)
- Parking.Infrastructure: Persistencia (EF Core), SignalR, RabbitMQ consumers
- Parking.Identity: Autenticación y autorización (OpenIddict)
- Parking.API: Controllers REST y configuración
- Parking.Migrator: Sistema de migración multi-tenant
- Parking.BillingRunner: Facturación automática en background
2. Parking.FrontEnd (Angular)
Aplicación web de gestión que se conecta al API. Incluye:
- Dashboard con monitoreo en tiempo real
- Gestión de abonados y estacionamiento rotativo
- Facturación y caja
- Administración de roles y permisos
- Conexión SignalR para eventos en tiempo real
3. ALPRParkingEngine (Python / NVIDIA Jetson)
Motor de reconocimiento automático de patentes que corre en hardware edge:
- Ejecuta en NVIDIA Jetson Orin Nano (15W)
- Procesa video en tiempo real con Computer Vision
- Envía detecciones via RabbitMQ al backend
- Envía heartbeats para monitoreo de conectividad
4. Parking.Web (Next.js 15)
Sitio comercial del producto y documentación centralizada (esta documentación).
Flujo de datos
Cámara → Jetson (ALPR) → RabbitMQ → Parking.API → SignalR → Angular (Browser)Detección de patentes
- La cámara captura video continuamente
- El Jetson procesa los frames con el modelo ALPR
- Cuando detecta una patente, envía un mensaje a RabbitMQ
- El
RabbitMqConsumerServicedel API consume el mensaje - Se guarda la detección en PostgreSQL
- Se envía la detección via SignalR al grupo del tenant correspondiente
- El browser del operador recibe la detección en tiempo real
Monitoreo de dispositivos
- El Jetson envía heartbeats periódicos via RabbitMQ
- El
DeviceMonitorServiceverifica el último heartbeat de cada dispositivo - Si un dispositivo no envió heartbeat en X segundos, se marca como offline
- Los cambios de estado se envían via SignalR a los browsers del tenant
- Se crea una notificación para el operador
Multi-tenancy
El sistema soporta múltiples estacionamientos (tenants) en una sola instancia:
- Cada tenant tiene su propia base de datos PostgreSQL
- El
TenantMiddlewareextrae eltenant_iddel JWT token - SignalR usa grupos por tenant para aislar las notificaciones
- El
Parking.Migratorgestiona migraciones independientes por tenant
Infraestructura
| Componente | Tecnología |
|---|---|
| Backend API | Docker container en Ubuntu Server |
| Base de datos | PostgreSQL (una por tenant) |
| Message Queue | RabbitMQ |
| Reverse Proxy | Nginx con SSL (Let's Encrypt) |
| Edge Computing | NVIDIA Jetson Orin Nano |
| Frontend | Servido como static build via Nginx |
Comunicación en tiempo real
ParkVision usa SignalR con WebSocket para comunicación push:
- Eventos:
DeviceStatusChanged,NewDetection,NewNotification - Grupos: Cada tenant tiene su grupo SignalR (
tenant-{id}) - Transporte: WebSocket directo (skip negotiation) a través de Nginx
- Reconexión: Automática con backoff exponencial