Event-Driven Architecture en C#: Guía Completa

Introducción: Reaccionar a eventos

Event-Driven Architecture organiza el sistema alrededor de eventos. Los productores publican, los consumidores reaccionan.

Esto desacopla componentes y permite escalado flexible.

El precio del desacoplamiento es la complejidad: orden de eventos, consistencia eventual y necesidad de idempotencia en los consumidores.

Cuando el volumen crece, necesitas monitoreo, trazas y contratos de eventos bien versionados para evitar rupturas.

Event-Driven
Prompt: Event bus with multiple subscribers, clean minimal style.

1. Naturaleza: Señales en el ecosistema

Un sonido de alerta activa respuestas distintas en diferentes especies.

El evento se emite una vez, pero tiene múltiples reacciones.

Algunas especies reaccionan de inmediato y otras lo hacen con retraso. Esa diferencia se parece a los consumidores rápidos y lentos en una arquitectura basada en eventos.

Señales
Prompt: Wildlife reacting to a sound wave, soft natural illustration.

2. Mundo Real: Notificaciones en tiempo real

Un pago genera eventos que actualizan inventario, envíos y facturación.

Cada servicio responde según su necesidad sin acoplarse al resto.

Si un servicio falla, el evento puede reintentarse o procesarse más tarde sin bloquear a los demás. Esa resiliencia es una de las razones principales para usar este estilo.

Notificaciones
Prompt: Notification flow diagram, clean flat style.

3. Implementación en C#: Código Paso a Paso

public class EventBus
{
    public event Action Evento;
    public void Publicar(string mensaje) => Evento?.Invoke(mensaje);
}

var bus = new EventBus();
bus.Evento += msg => Console.WriteLine($"Recibido: {msg}");
bus.Publicar("Pago confirmado");

En producción, un bus en memoria no es suficiente. Necesitas un broker confiable, manejo de reintentos y consumidores idempotentes para evitar duplicados.

También conviene definir contratos explícitos para cada evento y versionarlos para permitir evolución sin romper a los consumidores.

4. Event-Driven vs Request-Reply

Event-Driven es asíncrono y desacoplado; Request-Reply es directo y síncrono.

Usa eventos cuando quieras difusión y escalabilidad; usa request-reply para operaciones críticas.

Muchos sistemas combinan ambos: eventos para integración y APIs sincrónicas para lecturas o confirmaciones inmediatas.

5. Diagrama UML

UML Event-Driven
Prompt: UML diagram of event-driven architecture, clean vector layout.
Flujo eventos
Prompt: Event flow diagram with publishers and subscribers, minimal infographic style.

⚠️ Cuándo NO Usar Event-Driven

  • Si necesitas consistencia inmediata y transacciones fuertes.
  • Si el sistema es muy simple y no requiere desacoplamiento.
  • Si el equipo no cuenta con tooling de observabilidad o monitoreo.

💪 Ejercicio

Diseña un flujo de eventos para un sistema de pedidos con envío y notificaciones.

Conclusión

Event-Driven Architecture es clave para sistemas desacoplados y reactivos, pero requiere buena observabilidad.

Cuando defines eventos claros y consumidores idempotentes, obtienes un sistema flexible y resistente a cambios.