←Volver al portafolio
GitHub
CompletadoDesarrollado por Gibmyx Gomez

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.

Diagrama de flujo & topologíasymfony-microservices-ddd.architecture
                ┌─ 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

Message Broker & Colas

RabbitMQ 3.13 (AMQP 0-9-1)

Topic exchanges, colas de procesamiento asíncrono, balanceo de carga y aislamiento de fallos con DLQ.

Caché, Locks & Memoria

Redis 7 (Alpine)

Locks distribuidos (Symfony Lock), control de idempotencia y caché de lectura ultrarrápida (<1ms).

Backend Framework

Symfony 7.4 + PHP 8.3 FPM

Núcleo de la API REST, orquestación con Symfony Messenger, inyección de dependencias y validaciones.

Arquitectura de Software

Hexagonal Architecture & DDD

Separación estricta de Domain, Application e Infrastructure con contratos agnósticos y desacoplamiento.

Base de Datos Relacional & Vectorial

PostgreSQL 16 + pgvector

Almacenamiento ACID transaccional de órdenes, usuarios e índice vectorial para búsqueda semántica.

Seguridad & Auth

LexikJWTAuthentication (RS256)

Autenticación stateless por tokens JWT mediante par de llaves criptográficas pública/privada.

Contenedores & Infraestructura

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

1

Creación asíncrona de pedidos con respuesta HTTP 202 Accepted en menos de 15ms sin bloquear al cliente.

2

Broker de mensajería con RabbitMQ (Topic Exchange 'orders_exchange', enrutamiento por topics y DLQ).

3

Locks distribuidos y claves de idempotencia con Redis para blindar compras simultáneas duplicadas.

4

Consulta instantánea de estado en Redis (<1ms) con cabeceras de trazabilidad 'X-Cache: HIT/MISS'.

5

Autenticación segura stateless mediante JWT (firmado RS256 con par de llaves criptográficas) en módulo Auth.

6

Worker en segundo plano dedicado con políticas de reintento exponencial y reinicio en caliente (graceful restart).

7

Documentación interactiva OpenAPI / Swagger UI autogenerada con API Platform en /api/docs.

8

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.

Explorar en GitHub