Be Software Architecture Wise
Be Wise Apps

Read in English · Lire en français · Auf Deutsch lesen

Sección 6.4 de 6.8 · Avanzado · 28 min de lectura

Arquitectura dirigida por eventos: brokers, mediadores y flujos de eventos

Videolección

5 min · narrado en inglés, con subtítulos
Solo escuchar (audio)
Leer la transcripción

En un sistema dirigido por eventos, unas partes anuncian lo que ha ocurrido y otras reaccionan. En esta lección aprenderás cómo funciona y cómo mantenerlo fiable cuando los mensajes se pierden o se repiten.

Piensa en la cocina de un restaurante con mucho trabajo. Un camarero cuelga una comanda en el riel, y a nadie se le dice qué hacer. El cocinero de la parrilla ve un filete que cocinar, el puesto de ensaladas ve una ensalada y el pastelero ve un postre para más tarde. Cada uno reacciona a su propio ritmo. Si el pastelero está en su descanso, la comanda espera en el riel hasta que vuelva. Y añadir un puesto nuevo no cambia la forma en que los camareros escriben las comandas. Un sistema dirigido por eventos funciona igual.

Hay tres palabras que a menudo se usan sin precisión. Un evento es un hecho que ha ocurrido, como OrderPlaced. Cualquier número de servicios puede recibirlo, y el publicador no sabe quiénes son. Un comando es una solicitud dirigida a un único manejador, como AuthorisePayment. A diferencia de un evento, puede rechazarse. Un mensaje es simplemente el sobre que transporta cualquiera de los dos. Una cola entrega cada mensaje a un solo consumidor, lo que encaja con los comandos. Un topic da a cada suscriptor su propia copia, lo que encaja con los eventos.

Esta es la topología de broker, sin coordinador central. El servicio de pedidos publica un evento OrderPlaced en el topic de pedidos y sigue con lo suyo. Cada servicio interesado reacciona a su propio ritmo: pagos autoriza la tarjeta, la tableta del restaurante muestra el pedido, notificaciones envía una confirmación y analítica actualiza sus paneles. Después, pagos publica su propio evento, PaymentAuthorised, y despacho reacciona asignando un repartidor. El flujo de trabajo solo existe como la suma de esas reacciones. Esto se llama coreografía. Añadir el año que viene un servicio de detección de fraude supone una suscripción nueva, y ningún cambio en pedidos.

En la topología de mediador, un mediador de pedidos dirige el flujo de trabajo. Conoce los pasos, su orden y qué hacer en caso de fallo. Esto se llama orquestación. Envía comandos a cada servicio por turno y actúa según sus respuestas. La coreografía es la que menos acopla, pero el flujo completo es difícil de ver. La orquestación lo hace visible, con el riesgo de crear un cuello de botella. La mayoría de los sistemas reales combinan ambas.

Un broker basado en logs, como Apache Kafka, conserva los eventos se hayan leído o no. Un topic se divide en particiones, cada una un log ordenado, y cada evento tiene una posición llamada su offset. Los consumidores se unen a un grupo. Dentro de un grupo, cada partición la lee un solo consumidor a la vez, así que el grupo se reparte el trabajo. Otro grupo, como analítica, lee los mismos eventos de forma independiente, con sus propios offsets. Los eventos con la misma clave, como el número de un pedido, caen todos en una partición, en orden. Pero el orden solo está garantizado dentro de una partición, nunca entre particiones. Y como cada partición tiene un consumidor por grupo, el número de particiones limita el paralelismo. Doce particiones mantienen ocupados como máximo a doce consumidores de un grupo.

Cuando una caída deja sin aclarar si un mensaje se procesó, hay que ceder en algo. Como máximo una vez significa nunca dos veces, pero a veces ninguna. Eso está bien para los avisos de ubicación de los repartidores, donde la siguiente actualización sustituye a la anterior. Al menos una vez significa que nunca se pierde, pero a veces se procesa dos veces. Es la elección habitual para los eventos de negocio. La entrega exactamente una vez a través de una red no fiable no es alcanzable en general. Los sistemas solo pueden ofrecer un efecto exactamente una vez dentro de un límite definido. Así que da por hecho que la entrega es al menos una vez, y haz que cada consumidor sea idempotente. Da a cada evento un identificador único, registra los identificadores procesados en la misma transacción local que el cambio y omite los que ya hayas visto.

Una vez que otros equipos consumen un evento, su estructura es un contrato, y los consumidores pueden leer eventos escritos hace meses. Da a cada evento un identificador, un tipo, una versión y una marca de tiempo, y cámbialo solo de formas compatibles. Algunos fallos son temporales, como una base de datos que no está disponible durante un momento. Reinténtalos unas pocas veces con esperas crecientes y aleatorias. Otros fallarán siempre, como un evento mal formado. Este mensaje envenenado no debe bloquear su partición. Muévelo a una cola de mensajes fallidos, y asegúrate de que alguien la vigile. Y publica hechos, no comandos disfrazados. SendConfirmationEmail, publicado en un topic, es un comando con su acoplamiento oculto. Publica OrderPlaced, y deja que notificaciones decida.

La sección completa también trata cuatro formas distintas de usar los eventos, y los esquemas de eventos con más profundidad. A continuación, en la Sección seis punto cinco, compararemos la comunicación síncrona y asíncrona, y el diseño de API. Nos vemos allí.

Lo que necesitas saber

Definición: reaccionar a lo que ocurre

En la arquitectura dirigida por eventos (EDA), los componentes se comunican produciendo eventos y reaccionando a ellos: registros de hechos que han ocurrido en el negocio, como se hizo un pedido o se asignó un repartidor. El componente que publica un evento no llama a los componentes que reaccionan a él y normalmente ni siquiera sabe que existen. Un intermediario de mensajes (message broker) lleva los eventos de los productores a los consumidores, los retiene mientras los consumidores están ocupados o caídos, y permite añadir consumidores nuevos sin cambiar el productor.

Los diseños dirigidos por eventos no son nuevos: las interfaces gráficas de usuario, los sistemas operativos y los sistemas de negociación bursátil llevan décadas funcionando así, y los productos de mensajería empresarial son anteriores a la web. Lo que cambió en la década de 2010 fue la escala y la durabilidad. Los brokers basados en logs, como Apache Kafka, creado en LinkedIn y publicado como código abierto en 2011, hicieron viable conservar cada evento de negocio durante días o años y volver a reproducirlos. La EDA puede ser el estilo principal de un sistema o, con más frecuencia, la forma en que se comunican entre sí los servicios de un sistema de microservicios o basado en servicios.

Eventos, comandos y mensajes

Hay tres palabras que a menudo se usan sin precisión, y la diferencia importa. Un mensaje es el sobre: cualquier dato enviado de un programa a otro a través de un canal. Lo que transporta el mensaje puede ser un evento (un hecho, nombrado en tiempo pasado), un comando (una solicitud dirigida a un único manejador, nombrada como una instrucción) o una consulta y su respuesta. Enterprise Integration Patterns (2003), de Gregor Hohpe y Bobby Woolf, catalogó estos tipos de mensaje y los canales que los transportan, y su vocabulario sigue siendo el estándar.

Evento, comando y mensaje

EventoComandoMensaje (el sobre)
SignificadoUn hecho: algo que ha ocurridoUna solicitud: por favor, haz algoCualquier dato enviado de un programa a otro a través de un canal
NombresEn pasado: OrderPlaced, PaymentAuthorisedEn imperativo: AuthorisePayment, AssignCourierTransporta un evento, un comando, una consulta o una respuesta
ReceptoresCero, uno o muchos; el publicador no los conoceExactamente un manejador previstoDepende del canal: una cola (uno) o un topic (muchos)
¿Puede rechazarse?No; ya ha ocurrido. Los receptores deciden cómo reaccionarSí; el manejador puede rechazarlo o fallar al procesarloNo procede
AcoplamientoEl publicador no depende de los consumidoresEl emisor depende de la capacidad y del contrato del receptorDepende de lo que transporte

Los mensajes viajan por dos tipos de canal. Una cola entrega cada mensaje a uno de sus consumidores, lo que encaja con los comandos y el reparto de trabajo. Un topic entrega una copia de cada mensaje a cada suscriptor, lo que es publicación-suscripción (pub-sub) y encaja con los eventos. Un diseño que envía OrderPlaced a un topic permite que Pagos, Restaurante, Notificaciones y Analítica reaccionen, cada uno a su propio ritmo; añadir el año que viene un servicio de detección de fraude supone una suscripción nueva y ningún cambio en Pedidos.

Topología de broker y topología de mediador

Richards y Ford describen dos topologías para los sistemas dirigidos por eventos. En la topología de intermediario (broker) no hay un coordinador central. Se publica un evento inicial; cada procesador interesado reacciona y puede publicar más eventos, a los que otros reaccionan a su vez. El flujo de trabajo solo existe como la suma de esas reacciones. Esto es coreografía: como bailarines que conocen cada uno sus propios pasos, nadie dirige el conjunto.

En la topología de mediador, un mediador de eventos recibe el evento inicial y dirige el flujo de trabajo, enviando comandos a los procesadores en un orden definido y actuando según sus respuestas. Esto es orquestación: un director de orquesta conoce la partitura. Los mediadores van desde un servicio sencillo con una máquina de estados hasta un motor de flujos de trabajo como Temporal, AWS Step Functions o un motor BPMN.

Topología de broker: el flujo de OrderPlaced

El flujo de OrderPlaced del reparto de comida en topología de broker: Pedidos publica OrderPlaced en un topic de pedidos; Pagos, Restaurante, Notificaciones y Analítica lo consumen cada uno de forma independiente; Pagos publica PaymentAuthorised, que Despacho consume para asignar un repartidorServicioPedidosBrokertopicpedidostopicpagosOrderPlacedPaymentAuthorisedpublicaPagosautoriza tarjetaRestaurantemuestra en la tabletaNotificacionesenvía confirmaciónAnalíticaactualiza panelespublicaDespachoasigna repartoDiscontinuas: eventos entregados a los suscriptores. Cada consumidor tiene su copia y su propia posición.
En la topología de broker, Pedidos solo anuncia el hecho; cada consumidor reacciona de forma independiente, y el propio evento de Pagos impulsa el paso siguiente.

Topología de mediador: el mismo flujo, orquestado

Topología de mediador: un mediador de pedidos recibe el evento inicial y envía comandos a Pagos, Restaurante, Despacho y Notificaciones en un orden definido, y recibe sus respuestasClientehace pedidoMediador pedidosconoce los pasos,su orden yqué hacer si hay fallosPagos1 Autorizar pagoRestaurante2 Avisar restauranteDespacho3 Asignar repartoNotificaciones4 Enviar confirmaciónSalen comandos; vuelvenrespuestas o eventos al mediador
En la topología de mediador, un componente es dueño de la secuencia, así que el flujo de trabajo es visible y los fallos se gestionan en un solo lugar.

¿Coreografía u orquestación?

PreguntaCoreografía (broker)Orquestación (mediador)
AcoplamientoEl más bajo: los publicadores no conocen a los consumidoresEl mediador depende del contrato de cada participante
Ver el flujo de trabajo completoDifícil: está repartido entre servicios; hace falta trazado para reconstruirloFácil: está escrito en un solo lugar
Manejo de erroresCada participante debe detectar los fallos y reaccionar a ellos, a menudo publicando eventos compensatoriosEl mediador decide de forma centralizada los reintentos, los timeouts y las compensaciones
Añadir un pasoAñadir un suscriptor; no cambia nada másCambiar el mediador
RiesgosCadenas cíclicas de eventos; nadie se da cuenta cuando un paso deja de funcionar en silencioEl mediador se convierte en un cuello de botella o acumula lógica de negocio
Encaja bien conFlujos sencillos y estables; muchas reacciones independientes a un mismo hechoFlujos de trabajo largos y condicionales con compensación, como la saga del pedido

La mayoría de los sistemas reales combinan ambas: coreografía entre contextos delimitados (Pedidos anuncia hechos y no le importa quién escucha) y orquestación dentro de un contexto cuando un proceso de varios pasos necesita un propietario claro.

Cuatro formas de usar los eventos

En un artículo de 2017, Martin Fowler señaló que 'dirigido por eventos' se usa para al menos cuatro patrones bastante diferentes, y que las conversaciones se tuercen cuando cada persona se refiere a uno distinto. Distinguirlos es uno de los hábitos más útiles que puede tener un arquitecto.

Los cuatro patrones de eventos de Fowler (2017)

PatrónQué transporta el evento y por quéBeneficioCosto
Notificación de eventosUna pequeña señal de que algo ha cambiado, a menudo solo un identificador: OrderPlaced {order_id}. Los receptores vuelven a llamar para obtener los detalles si los necesitan.Acoplamiento muy bajo; el modelo del publicador sigue siendo privado.Las llamadas de vuelta añaden carga y una dependencia en tiempo de ejecución del publicador; el flujo a lo largo de muchos eventos es difícil de ver.
Transferencia de estado transportada por eventosDatos suficientes para que los receptores mantengan su propia copia: el pedido completo con sus artículos y totales.Los receptores funcionan sin llamar al publicador, incluso cuando está caído; menor latencia.Los datos se copian ampliamente y son eventualmente consistentes; eventos más grandes; los esquemas se convierten en contratos.
Event sourcingCada cambio en el estado de una entidad se almacena como un evento; el log de eventos es la fuente de verdad y el estado actual se obtiene reproduciéndolo.Pista de auditoría completa; reconstruir estados pasados; vistas nuevas a partir de la historia antigua.Complejo; la reproducción es difícil cuando los resultados dependían de sistemas externos; los esquemas de eventos deben evolucionar para siempre.
CQRSModelos separados (a menudo almacenes separados) para escribir y para leer, con frecuencia alimentados por eventos.Cada lado está optimizado para su tarea; encaja con sistemas con muchas lecturas y consultas complejas.Dos modelos que mantener sincronizados; a menudo se aplica donde bastaría un solo modelo.

La notificación de eventos y la transferencia de estado transportada por eventos tratan de la comunicación entre servicios y pertenecen a este capítulo. El event sourcing y CQRS tratan de cómo almacena sus datos un servicio; a menudo se combinan con la EDA, pero son decisiones independientes, que se tratan en el Capítulo 7.

Flujos de eventos y logs: cómo funciona Kafka

Las colas de mensajes tradicionales eliminan un mensaje en cuanto un consumidor confirma su recepción. Un broker basado en logs, como Apache Kafka, en cambio, almacena los eventos en un log de solo anexado y los conserva durante un periodo de retención configurado (o para siempre), se hayan leído o no. De ese diseño se derivan varias cosas, que explican tanto los puntos fuertes de Kafka como sus trampas.

Un topic se divide en particiones, cada una de ellas un log ordenado que se almacena y se replica entre brokers. El productor elige la partición, normalmente aplicando un hash a la clave del evento, de modo que todos los eventos con la misma clave (por ejemplo, el mismo ID de pedido) van a la misma partición. Cada evento de una partición tiene una posición secuencial llamada su offset (desplazamiento). Los consumidores extraen los eventos y registran el offset al que han llegado; también pueden rebobinar y volver a reproducirlos.

Los consumidores se unen a un grupo de consumidores. Dentro de un grupo, cada partición la lee exactamente un consumidor a la vez, así que el grupo se reparte el trabajo; los distintos grupos leen de forma independiente, cada uno con sus propios offsets, y así se consigue el pub-sub. Por tanto, el número de particiones limita el paralelismo de un grupo: un topic con 12 particiones puede mantener ocupados como máximo a 12 consumidores de un grupo. (Kafka 4.2, lanzado en 2026, añadió los share groups como alternativa similar a una cola: varios consumidores pueden compartir una partición y confirmar los mensajes uno a uno, pero entonces no se conserva el orden dentro de la partición. Esta sección describe los grupos de consumidores clásicos).

Kafka garantiza el orden solo dentro de una partición. Los eventos de un pedido llegan en el orden en que se escribieron si comparten clave; los eventos de pedidos distintos, en particiones distintas, no tienen un orden definido entre sí. Los diseños que necesitan un orden global deben usar una sola partición (renunciando al paralelismo) o, mejor, rediseñarse para que solo importe el orden por entidad.

Particiones, offsets y grupos de consumidores

Un topic con tres particiones, cada una un log de solo anexado con offsets numerados; el grupo de consumidores pagos reparte las particiones entre dos consumidores, mientras que el grupo analítica lee las tres con un solo consumidorTopic order-events, 3 particiones (clave = ID de pedido)P0012345P1012345P2012345offsets: 0, 1, 2 ... eventos nuevos añadidos a la derechaGrupo: pagosConsumidor Alee P0, P1Consumidor Blee P2Grupo: analíticaConsumidor Clee P0, P1, P2Orden garantizado en una particiónlos eventos del pedido 4711 comparten clave,así que van a una partición, en ordenGrupos independientescada grupo guarda sus offsets confirmados;dentro de un grupo, un consumidor por partición
Cada partición es un log ordenado; un grupo de consumidores reparte las particiones entre sus miembros, y cada grupo lleva el control de sus propios offsets.

Garantías de entrega, y lo que significa realmente 'exactamente una vez'

Como las redes y los procesos fallan (Sección 6.1), un broker y sus clientes deben elegir qué ocurre cuando una caída o un timeout deja sin aclarar si un mensaje se procesó. Hay tres garantías posibles, y la elección depende de cuándo se registran las confirmaciones y los offsets.

Garantías de entrega

GarantíaQué prometeCómo se produceConsecuencia típica
Como máximo una vez (at-most-once)Cada mensaje se procesa una vez o ninguna; nunca dos veces.El consumidor registra su posición (confirma el offset o envía la confirmación) antes de procesar, o el productor nunca reintenta.Pueden perderse mensajes tras una caída. Aceptable para muestras de métricas o avisos de ubicación de los repartidores, donde la siguiente actualización sustituye a la anterior.
Al menos una vez (at-least-once)Cada mensaje se procesa una o más veces; nunca se pierde.El productor reintenta hasta recibir la confirmación, y el consumidor confirma su posición solo después de procesar.Duplicados tras caídas, reintentos y rebalanceos. Es la opción por defecto de la mayoría de los brokers y la elección habitual para los eventos de negocio.
Efectivamente una vez (effectively-once)El efecto de cada mensaje se aplica exactamente una vez, aunque el mensaje pueda entregarse más de una vez.Entrega al menos una vez más un consumidor idempotente, o una transacción que almacena juntos el resultado y la posición del consumidor.El significado práctico de 'exactamente una vez' en los sistemas de negocio; exige un diseño deliberado en cada consumidor.

'Exactamente una vez' necesita una definición cuidadosa. La entrega exactamente una vez a través de una red no fiable no es alcanzable en general: un emisor que no recibe confirmación no puede saber si debe reenviar. Lo que los sistemas pueden ofrecer es un efecto exactamente una vez dentro de un límite definido. Kafka, por ejemplo, ofrece un productor idempotente y transacciones desde la versión 0.11 (2017), de modo que un ciclo de lectura, procesamiento y escritura de topics de Kafka a topics de Kafka confirma su salida y los offsets de su consumidor de forma atómica. Esa garantía se detiene en el borde de Kafka. Si el consumidor cobra una tarjeta, envía un correo electrónico o escribe en otra base de datos, una caída entre esa acción y la confirmación del offset hará que la acción se repita, a menos que el propio consumidor sea idempotente o almacene sus offsets en la misma transacción que sus resultados.

Por eso, la regla práctica para los arquitectos es sencilla: da por hecho que la entrega es al menos una vez y haz que cada consumidor sea un consumidor idempotente. Da a cada evento un identificador único; en el consumidor, registra los identificadores procesados en la misma transacción local que el cambio de estado y omite cualquier evento ya registrado. Siempre que sea posible, haz también que la operación sea idempotente por naturaleza, por ejemplo 'poner el estado en PAID si está en AWAITING_PAYMENT' en lugar de 'añadir un pago'.

# Idempotent consumer: processing the same event twice has the effect of once
def handle_payment_authorised(event, db):
    with db.transaction():                       # one local ACID transaction
        inserted = db.execute(
            "INSERT INTO processed_events (event_id) VALUES (%s) "
            "ON CONFLICT (event_id) DO NOTHING",
            [event["event_id"]],
        ).rowcount
        if inserted == 0:
            return                               # seen before: do nothing
        db.execute(
            "UPDATE orders SET status = 'PAID' WHERE order_id = %s "
            "AND status = 'AWAITING_PAYMENT'",
            [event["order_id"]],
        )
    # commit the broker offset only after the transaction has committed
Un consumidor idempotente: el registro de eventos procesados y el cambio de estado se confirman juntos, así que un evento reentregado no cambia nada.

Esquemas y versionado de los eventos

Una vez que otros equipos consumen un evento, su estructura es un contrato publicado, igual que una API, y dura más: con un broker basado en logs, los consumidores pueden leer eventos escritos hace meses. Un buen evento tiene un identificador único, un tipo, una versión del esquema, el momento en que ocurrió, los identificadores de las entidades implicadas y los datos de negocio que necesitan los consumidores. El dinero se almacena en unidades menores con una divisa, nunca como un número de coma flotante (Capítulo 0).

{
  "event_id": "9f1c2e7a-4b0d-4e55-9a51-0c3d8f2b6a10",
  "type": "OrderPlaced",
  "schema_version": 2,
  "occurred_at": "2026-10-22T18:42:07Z",
  "order_id": "ord-4711",
  "customer_id": "cus-208",
  "restaurant_id": "res-31",
  "items": [{"dish_id": "d-5", "qty": 2, "price_minor": 1150}],
  "total_minor": 2450,
  "currency": "GBP"
}
Un evento OrderPlaced que usa transferencia de estado transportada por eventos: identificadores, versión, momento y los datos que necesitan los consumidores.

Los esquemas deben evolucionar de forma compatible hacia atrás: añadir campos opcionales, nunca eliminar ni renombrar campos ni cambiar su significado sin una versión nueva, y nunca reutilizar el nombre de un campo para algo distinto. Muchos equipos lo imponen con un formato de esquema como Avro, Protocol Buffers o JSON Schema y un registro de esquemas que rechaza los cambios incompatibles en el momento de publicar. La especificación CloudEvents, un proyecto graduado de la Cloud Native Computing Foundation, estandariza los atributos comunes del sobre, como id, source, type y time. Los modos de compatibilidad y las técnicas de migración se tratan en evolución de esquemas.

Manejo de errores: reintentos, mensajes envenenados y colas de mensajes fallidos

Los consumidores fallan por dos motivos muy diferentes, y necesitan un tratamiento distinto. Los fallos transitorios, como una base de datos que no está disponible durante un momento o un timeout al llamar a otro servicio, suelen tener éxito al reintentar; reintenta unas pocas veces con backoff exponencial y jitter (esperas crecientes y aleatorias) para no saturar una dependencia que ya tiene problemas. Los fallos permanentes, como un evento mal formado o uno que infringe una regla de negocio, fallarán siempre. Un 'mensaje envenenado' (poison message) así no debe bloquear al consumidor para siempre, lo que en un log particionado detendría todos los eventos posteriores de esa partición.

La respuesta estándar es una cola de mensajes fallidos (dead-letter queue, DLQ): tras un número fijado de intentos, el mensaje se mueve a un canal aparte, con el error registrado, y el consumidor sigue adelante. Una DLQ solo es útil si alguien la vigila: genera alertas según su tamaño, asigna su propiedad a un equipo concreto, ofrece herramientas para inspeccionar, corregir y volver a reproducir los mensajes, y decide de antemano qué garantías de orden se pierden cuando un mensaje se reproduce tarde. Algunos equipos añaden uno o más topics de reintento intermedios con esperas más largas antes de la DLQ.

Características de la arquitectura dirigida por eventos

CaracterísticaValoraciónRazón
Escalabilidad y elasticidadAltoLos consumidores escalan de forma independiente y absorben las ráfagas gracias al búfer del broker; las particiones permiten el paralelismo.
Capacidad de respuestaAltoEl publicador responde en cuanto el evento queda registrado de forma duradera; el trabajo lento se hace después.
Tolerancia a fallosAltoUn consumidor puede estar caído durante minutos y ponerse al día desde el broker; los fallos no se propagan en cascada hacia el publicador.
ExtensibilidadAltoLos consumidores nuevos se suscriben a los eventos existentes sin ningún cambio en el publicador.
Consistencia de los datosBajoEl estado se propaga entre los servicios con retraso; los lectores ven datos desactualizados durante un tiempo.
Capacidad de prueba y de depuraciónBajoEl comportamiento surge de reacciones asíncronas; reproducir una secuencia de eventos entre servicios es difícil sin un buen trazado.
Visibilidad del flujo de trabajoDe baja (coreografía) a media (mediador)En la coreografía, nadie es dueño del flujo de extremo a extremo; un mediador lo hace explícito.
SimplicidadBajoHay que diseñar los brokers, los esquemas, los reintentos, el manejo de mensajes fallidos, el orden y los duplicados.

Cuándo usarla y errores habituales

La arquitectura dirigida por eventos encaja cuando muchas partes de un negocio deben reaccionar a los mismos hechos, cuando el trabajo puede hacerse después de que responda la solicitud del usuario, cuando la carga llega a ráfagas y hay que suavizarla, y cuando se esperan consumidores nuevos con el tiempo. Encaja peor cuando un usuario necesita una respuesta inmediata y definitiva que depende de varios servicios (aunque una llamada síncrona para la respuesta más eventos para el seguimiento es un híbrido habitual), o cuando se exige consistencia fuerte entre servicios.

Comprueba lo que has entendido

¿ReserveCourier es un evento o un comando, y cómo lo sabrías?

Un comando: es una instrucción dirigida a un único manejador (Despacho), que puede rechazarla. Un evento se nombraría en tiempo pasado, como CourierReserved.

Un topic de Kafka tiene 6 particiones y un grupo de consumidores tiene 10 consumidores. ¿Cuántos consumidores estarán ocupados?

Como máximo 6. Dentro de un grupo, cada partición se asigna a un solo consumidor, así que 4 consumidores quedan inactivos.

¿Por qué el soporte de Kafka para 'exactamente una vez' no impide que un consumidor envíe dos veces un correo electrónico de confirmación?

Sus transacciones abarcan la lectura y la escritura en topics de Kafka y la confirmación de los offsets; un correo electrónico enviado a un sistema externo queda fuera de ese límite, así que una caída antes de confirmar el offset provoca un reprocesamiento, a menos que el consumidor sea idempotente.

¿Qué diferencia hay entre la notificación de eventos y la transferencia de estado transportada por eventos?

La notificación envía una pequeña señal, a menudo solo un identificador, así que los receptores vuelven a llamar para obtener los detalles; la transferencia de estado incluye los datos que necesitan los receptores, de modo que pueden mantener su propia copia y evitar llamar al publicador.

Siguiente · 6.5Comunicación y APICómo se comunican los servicios: el acoplamiento que crean la comunicación síncrona y la asíncrona, REST y la semántica de HTTP, gRPC, GraphQL y la mensajería, y las prácticas de diseño de API que permiten que las interfaces evolucionen sin romper a los consumidores.Continuar →

Fuentes y lecturas recomendadas

¿Tienes una pregunta sobre esta sección? ArchitectBot, el asistente de estudio con IA del curso, responde primero a partir del curso.

Pregunta: “Nuestros eventos de pedidos pasan por Kafka y algunos clientes reciben de vez en cuando dos correos electrónicos de confirmación. ¿Qué está pasando y cómo deberíamos diseñar el consumidor?”