Symfony Event-Driven API
Procesamiento Asíncrono de Pedidos con RabbitMQ, Redis y Arquitectura Hexagonal
API RESTful empresarial de alto rendimiento orientada a eventos para el procesamiento asíncrono de pedidos y órdenes. Implementa mensajería asíncrona desacoplada con RabbitMQ (AMQP Topic Exchanges y colas con DLQ para tolerancia a fallos), control de idempotencia y locks distribuidos con Redis para prevenir compras duplicadas o condiciones de carrera, y caché de consulta ultrarrápida (<1ms con cabeceras X-Cache: HIT/MISS). El núcleo de dominio aplica Arquitectura Hexagonal y Domain-Driven Design (DDD) puro en PHP 8.3 FPM, persistido en PostgreSQL 16 con soporte para búsqueda vectorial vía pgvector y orquestado en Docker Compose con un worker dedicado en segundo plano.
Tecnologías clave
- RabbitMQ
- Redis
- Symfony 7.4
- Arquitectura Hexagonal
- PHP 8.3
- Domain-Driven Design
- PostgreSQL (pgvector)
- Docker Compose
- API Platform
- Event-Driven
Ingeniería & Diseño
Arquitectura del Sistema
Arquitectura en capas concéntricas (Domain, Application e Infrastructure) bajo Arquitectura Hexagonal y DDD. Las solicitudes HTTP de creación de pedidos son validadas con claves de idempotencia y locks distribuidos en Redis, registradas con estado inicial PENDING y despachadas de inmediato (<15ms) a RabbitMQ. Un worker dedicado en segundo plano consume los eventos AMQP de forma asíncrona para ejecutar la lógica de facturación y notificaciones, mientras que las consultas de estado se resuelven en memoria en Redis en <1ms.
┌─ CLIENTE / FRONTEND ────────────────────────────────────────────────────────┐
│ POST /api/orders (X-Idempotency-Key) │ GET /api/orders/{id}/status │
└────────────────────────┬───────────────────────────────────▲────────────────┘
│ │ X-Cache: HIT (<1ms)
▼ │
┌─ SYMFONY 7.4 API (Arquitectura Hexagonal / DDD) ───────────┴────────────────┐
│ src/Modules/Order/ │
│ ├── Domain/ (Entidad Order, OrderStatus Enum, Repository) │
│ ├── Application/ (CreateOrderUseCase, GetOrderStatusUseCase, DTOs) │
│ └── Infrastructure/ (Controllers, Repositories, Messenger Publisher) │
└──────────┬─────────────────────────────┬───────────────────▲────────────────┘
│ 1. Lock & Idempotencia │ 2. Mensaje AMQP │ Cache Miss
▼ ▼ │
┌─ REDIS 7 (In-Memory) ┐ ┌─ RABBITMQ 3.13 (AMQP Broker) ─┐│
│ - Locks distribuidos │ │ orders_exchange (Topic) ││
│ - Claves idempotencia│ │ ├── order_processing Queue ││
│ - Caché status <1ms │ │ └── dead_letter_orders DLQ ││
└──────────────────────┘ └────────────┬──────────────────┘│
│ │
▼ │
┌─ BACKGROUND WORKER CONTAINER ──┤
│ bin/console messenger:consume │
│ - Procesa orden y validación │
│ - Actualiza estado en Redis ──┘
│ - Despacha SendNotification │
└────────────┬───────────────────┘
│ Persistencia ACID
▼
┌─ BASE DE DATOS TRANSACCIONAL ──────────────────────────────────────────────┐
│ - PostgreSQL 16 con extensión pgvector (búsqueda semántica) │
└────────────────────────────────────────────────────────────────────────────┘
Puntos clave de la arquitectura
- Mensajería Asíncrona con RabbitMQ: Desacoplamiento total entre la recepción del pedido y su ejecución pesada mediante Symfony Messenger, exchanges tipo Topic, colas dedicadas y Dead Letter Queue (DLQ) para reintentos exponenciales.
- Idempotencia y Locks Distribuidos con Redis: Manejo de claves de idempotencia (X-Idempotency-Key) con TTL y semáforos distribuidos (Symfony Lock) para neutralizar peticiones duplicadas o condiciones de carrera en alta concurrencia.
- Caché de Estado Ultrarrápido (<1ms): Los endpoints de polling consultan directamente la clave de estado en Redis devolviendo cabecera 'X-Cache: HIT', con fallback automático y repoblación transparente ante expiración ('X-Cache: MISS').
- Arquitectura Hexagonal & DDD Puro: Dominio rico encapsulado sin dependencias de infraestructura ni de framework; puertos de salida para persistencia, caché y mensajería desacoplados mediante contratos.
- Worker Autónomo Resiliente: Contenedor Docker dedicado ejecutando 'messenger:consume async_orders' permanentemente con reinicio seguro y control de memoria.
- Soporte Vectorial con pgvector: PostgreSQL 16 equipado para almacenar embeddings y realizar búsquedas semánticas por similitud en catálogos de productos.
Ecosistema
Stack Tecnológico Detallado
RabbitMQ 3.13 (AMQP 0-9-1)
Topic exchanges, colas de procesamiento asíncrono, balanceo de carga y aislamiento de fallos con DLQ.
Redis 7 (Alpine)
Locks distribuidos (Symfony Lock), control de idempotencia y caché de lectura ultrarrápida (<1ms).
Symfony 7.4 + PHP 8.3 FPM
Núcleo de la API REST, orquestación con Symfony Messenger, inyección de dependencias y validaciones.
Hexagonal Architecture & DDD
Separación estricta de Domain, Application e Infrastructure con contratos agnósticos y desacoplamiento.
PostgreSQL 16 + pgvector
Almacenamiento ACID transaccional de órdenes, usuarios e índice vectorial para búsqueda semántica.
LexikJWTAuthentication (RS256)
Autenticación stateless por tokens JWT mediante par de llaves criptográficas pública/privada.
Docker + Docker Compose (7 servicios)
Orquestación reproducible con PHP-FPM 8.3, Nginx, Postgres, RabbitMQ, Redis, Worker y Redis Commander.
Capacidades
Características Principales
Creación asíncrona de pedidos con respuesta HTTP 202 Accepted en menos de 15ms sin bloquear al cliente.
Broker de mensajería con RabbitMQ (Topic Exchange 'orders_exchange', enrutamiento por topics y DLQ).
Locks distribuidos y claves de idempotencia con Redis para blindar compras simultáneas duplicadas.
Consulta instantánea de estado en Redis (<1ms) con cabeceras de trazabilidad 'X-Cache: HIT/MISS'.
Autenticación segura stateless mediante JWT (firmado RS256 con par de llaves criptográficas) en módulo Auth.
Worker en segundo plano dedicado con políticas de reintento exponencial y reinicio en caliente (graceful restart).
Documentación interactiva OpenAPI / Swagger UI autogenerada con API Platform en /api/docs.
Stack 100% contenerizado con Docker Compose (7 servicios: PHP-FPM, Nginx, Postgres, Redis, RabbitMQ, Worker y Redis Commander).
Decisiones de Ingeniería
¿Cómo se creó este proyecto?
Diseñado para resolver el cuello de botella tradicional de pasarelas de pago y operaciones de checkout pesadas, donde las llamadas síncronas bloquean conexiones y agotan recursos de servidor.
La integración de RabbitMQ para desacoplar el procesamiento asíncrono y Redis para sincronización de locks distribuidos garantiza que ninguna transacción se procese por duplicado incluso bajo alta concurrencia o reintentos de red del cliente.
La Arquitectura Hexagonal y DDD garantizan que el núcleo de negocio permanezca 100% puro e independiente del broker de mensajería o del motor de persistencia utilizado.
¿Quieres revisar el código fuente completo?
El repositorio público contiene el historial de commits, pruebas e instrucciones de ejecución.