Table of Contents
Diseño de eventos (EDA) se ha convertido en un paradigma de diseño fundamental para construir sistemas distribuidos, escalables y sensibles. En lugar de depender de un acoplamiento estrecho entre componentes mediante llamadas directas o invocaciones de procedimientos remotos, EDA cambia la comunicación a la producción, detección y consumo de eventos.Un evento es un cambio significativo en el estado, algo que sucedió que otras partes del sistema podrían importar.
¿Qué es la arquitectura de eventos?
Los consumidores de la enfermedad de los eventos, como los que se necesitan, se mantienen en el pasado, y que los eventos de los que se trata, como los que se necesitan, como los que se hacen, son los que se hacen más rápidos, y que los que se encuentran en el mundo entero, y que los que están en el mundo, no tienen que ser los que están en el mundo.
Esta arquitectura contrasta con los modelos tradicionales de respuesta a solicitudes sincronizadas, donde un servicio llama directamente a otro servicio y espera una respuesta. La comunicación sincronizada crea un acoplamiento estrecho: si el servicio de abajo es lento o no está disponible, el llamante está bloqueado. Con EDA, los productores de eventos de incendios y inmediatamente continuar su trabajo. Los consumidores procesan eventos de manera asincrónica, a menudo con sus propias políticas de escalado.
EDA es especialmente potente en los ecosistemas de microservicios, entornos de poliglota y cualquier dominio que requiera una alta rentabilidad, baja latencia o flujos de trabajo impulsados por eventos como procesamiento de pedidos, ingestión de datos IoT y detección de fraude.
Patrones básicos en arquitectura de eventos
Publicación/Subscripción (Pub/Sub)
El patrón Publish/Subscribe (Pub/Sub) es el patrón EDA más simple y adoptado más ampliamente. En este modelo, los editores emiten eventos a un tema o canal. Los suscriptores registran interés en esos temas y reciben todos los eventos publicados a ellos. El corredor maneja el fan-out, las garantías de entrega y el filtrado. Los editores y suscriptores no tienen conocimiento del otro - esta es la esencia del acoplamiento suelto.
Por ejemplo, considere una plataforma de comercio electrónico. Cuando un cliente pone un pedido, el servicio de pedidos publica un evento OrderPlaced] a un tema "ordenados".
- El servicio de inventario deduce el stock.
- El servicio de facturación cobra al cliente.
- El servicio de notificación envía una confirmación de correo electrónico.
- El servicio de análisis registra el evento para la presentación de informes.
Cada suscriptor procesa el evento de forma independiente y a su propio ritmo. Si el servicio de notificación es lento, no afecta el servicio de pedido o el servicio de inventario. Este patrón es compatible con el escalado, puede agregar más instancias del servicio de inventario para manejar una carga mayor sin tocar otros componentes.
Herramientas populares para implementar Pub/Sub incluyen Apache Kafka], que proporciona flujos de eventos de alta velocidad, persistentes y repetibles; RabbitMQ con su correcto funcionamiento y intercambio de temas; y servicios de cloud-native como
Segregación de responsabilidad de las consultas de comandos (CQRS)
La Segregación de Responsabilidad Comandante (CQRS) es un patrón que separa las operaciones de escritura (comandantes) de las operaciones de lectura (preguntas) en diferentes modelos. En los sistemas tradicionales de CRUD, el mismo modelo de datos se utiliza tanto para actualizaciones como para lecturas, lo que puede llevar a problemas de rendimiento cuando la carga de trabajo es desequilibrada, por ejemplo, una compleja ruta de escritura que también necesita servir lectura de consultas optimizadas para un esquema diferente.
En un sistema basado en CQRS, un comando como PlaceOrder activa un modelo de escritura que valida las reglas de negocio y produce un evento (por ejemplo, )OrderCreated).Este evento actualiza la base de datos de escala de escritura. Mientras tanto, un modelo de lectura independiente puede ser utilizado por completo.
Los beneficios del CQRS incluyen:
- Performance:] Las cargas de trabajo de lectura pueden ser ser ser atendidos por tiendas especializadas sin tener que ver con los escritos.
- Seguridad: Puedes exponer comandos y consultas a diferentes audiencias; por ejemplo, un comando podría requerir autenticación, mientras que una consulta pública es sólo lectura.
- Scalability: Las partes de lectura y escritura pueden escalar independientemente en diferentes hardware o grupos.
- Flexibilidad: Puede evolucionar el esquema de lectura sin afectar la lógica del lado de comando.
Sin embargo, CQRS añade complejidad porque introduce eventual consistencia y a menudo requiere sincronización basada en eventos entre los dos lados. Se combina naturalmente con Event Sourcing, donde el lado de la escritura almacena una secuencia de eventos en lugar de una instantánea del estado actual. Martin Fowler's article on CQRS es un excelente recurso para entender los intercambios del patrón.
Azuzar el evento
Event Sourcing es un patrón en el que los cambios estatales se almacenan como una secuencia cronológica de eventos, no como una instantánea del estado actual. En lugar de sobreescribir un registro en una base de datos, cada mutación genera un nuevo evento anexado a un registro de eventos. El estado actual puede derivarse replaying todos los eventos desde el principio, o mediante instantáneas a intervalos para acelerar la recuperación.
Event Sourcing ofrece varias ventajas poderosas:
- Sendero completo de auditoría: Cada cambio se registra, lo que le permite ver la historia completa de una entidad.
- Debugging and debugging: Puedes replayear eventos en un entorno de desarrollo para reproducir errores o probar nueva lógica empresarial.
- Preguntas por medios: Se puede preguntar qué era el estado en cualquier momento.
- Facilidad de adoptar CQRS: La tienda de eventos sirve como modelo de escritura, y los modelos de lectura pueden suscribirse a eventos para actualizaciones en tiempo real.
El principal intercambio es mayor almacenamiento y complejidad. Buscar la tienda de eventos es a menudo ineficiente, por lo que normalmente construye modelos de lectura (Proyecciones) que materializan las opiniones. Event Sourcing es común en dominios como contabilidad financiera, bancaria y edición de documentos colaborativos donde se debe registrar cada cambio.
Aceleración del evento
El streaming de eventos trata los eventos como una secuencia de datos continua y sin límites. Este patrón se utiliza para análisis en tiempo real, monitoreo e integración de datos a escala. En caso de transmisión, los eventos se ingieren de múltiples productores y se procesan en tiempo real por procesadores de flujo que filtran, agregan y transforman los datos. Los resultados procesados pueden ser almacenados, enviados a otro flujo, o utilizados para desencadenar acciones de flujo.
Apache Kafka es el estándar de facto para la transmisión de eventos. Almacena eventos en registros inmutables a través de particiones para la tolerancia de fallas y escalabilidad horizontal. Los marcos de procesamiento de corriente como Kafka Streams, Apache Flink y Spark Streaming permiten un procesamiento complejo de eventos con semántica de una vez. Por ejemplo, una empresa de distribución de paseo podría hacer que los sitios GPS calcular precios de aumento, detectar disponibilidad de controladores y actualizar los tiempos reales.
La transmisión de eventos también es fundamental para la malla de datos y microservicios impulsados por eventos donde desea descodificar a los productores de datos de los consumidores a nivel de infraestructura de datos.
Otros Patrones y Patrones Importantes en Combinación
Saga Pattern
En las transacciones distribuidas, especialmente dentro de los microservicios, el patrón de Saga gestiona flujos de trabajo multi-pasos. Cada paso en una saga publica un evento o realiza una acción. Si un paso falla, la saga ejecuta eventos compensadores para dar vuelta atrás pasos anteriores. Sagas puede ser orquestado (un coordinador central le dice a cada servicio qué hacer) o coreografía (cada servicio escucha por eventos y decide por su cuenta).
Programación reactiva
Aunque no es estrictamente un patrón arquitectónico, la programación reactiva es un modelo de programación que se alinea bien con EDA. Los marcos como RxJS, Reactor y Akka Streams permiten a los desarrolladores componer lógica asincrónica y basada en eventos usando secuencias observables. Esto es especialmente útil en los clientes (por ejemplo, actualizaciones de interfaz de usuario en tiempo real) y en los flujos de servidor donde usted necesita procesar volúmenes altos de eventos con respaldo.
Colaboración de eventos
Event Collaboration es un patrón donde los servicios comparten un modelo de evento común y se comunican únicamente a través de eventos. Cada servicio mantiene su propia lógica de dominio y proyectos eventos en sus propias tiendas de datos. No hay llamadas directas de API de servicio a servicio. Este patrón maximiza la autonomía y se utiliza a menudo en el diseño basado en dominios con contextos consolidados.El principal reto es la versión: cuando el esquema de evento cambia, todos los consumidores deben ser actualizados o tolerados de schema evolución (vrov.
Elegir el patrón adecuado
La selección de un patrón de EDA depende de sus requisitos específicos.
- Coupling and independence: Si necesitas un alto decoupling y muchos consumidores, Pub/Sub es sencillo. Si necesitas modelos de lectura y escritura separados, combina CQRS con Event Sourcing.
- Las necesidades de coherencia: Para una fuerte consistencia, evite la EDA; utilice transacciones distribuidas o una base de datos con ACID estricto. Para una eventual consistencia, CQRS y Event Sourcing funcionan bien.
- Tresujeto y latencia: El streaming de eventos (Kafka) da la mejor entrada, mientras que Pub/Sub con un corredor como RabbitMQ ofrece menor latencia para mensajes más pequeños.
- Auditability: Event Sourcing es ideal para las industrias de la salud de cumplimiento.
- madurez del equipo: CQRS y Event Alentando a aumentar la complejidad. Asegúrese de que su equipo entienda la consistencia, evolución del esquema y la idempotencia.
Beneficios de la Arquitectura de Eventos
Más allá de las ventajas inmediatas de la desacoplación y la escalabilidad, la EDA ofrece varios beneficios operacionales y empresariales:
- Scalability: Cada componente escala de forma independiente basada en su propia carga. Durante una venta flash, puede escalar el servicio de pedido y sus suscriptores sin tocar los servicios de facturación o envío.
- Flexibilidad: Añadiendo un nuevo consumidor (por ejemplo, un nuevo oleoducto de análisis) no requiere cambios a los productores, lo que facilita la evolución del sistema con el tiempo.
- Responsabilidad a tiempo real: EDA apoya naturalmente las experiencias de los usuarios en tiempo real, como los paneles en vivo, las notificaciones y las actualizaciones instantáneas.
- Resilience: Si un consumidor falla, los eventos se perduran en el corredor y pueden ser repetidas. Los productores siguen trabajando. Este aislamiento evita fallos de cacación.
- Observabilidad: Los registros de eventos proporcionan una rica fuente de datos para monitorear, alertar y depurar los rastros distribuidos.
- Integración de datos: Los eventos pueden ser transmitidos a lagos de datos, almacenes o tuberías de aprendizaje automático para análisis, haciendo del sistema una fuente de verdad para toda la organización.
Desafíos y mejores prácticas
La EDA es poderosa pero no sin obstáculos. Los desafíos comunes incluyen:
- ]Congruencia evolutiva: Los consumidores pueden ver datos de estatura. Usted debe diseñar procesos de negocio que toleran demoras y implementan manipuladores idempotentes.
- Complexidad:] Gestionar esquemas de eventos, versionar y múltiples secuencias de eventos puede ser desalentador. Usar registros de esquemas y evolucionar esquemas de forma continua.
- Depuración y monitoreo: Los flujos de eventos distribuidos son más difíciles de rastrear. Invertir en herramientas de observabilidad como trazado distribuido (Jaeger, OpenTelemetry) y agregación de registros.
- duplicación de datos: Los eventos pueden ser duplicados; hacer que sus consumidores idempotente para procesar un evento dos veces tiene el mismo efecto que procesarlo una vez.
- Ordenación: No todos los flujos de eventos necesitan un orden estricto, pero cuando lo hacen (por ejemplo, las transiciones estatales de una sola entidad), partición por clave (por ejemplo, ID de entidad) y asegurar que el corredor preserva el orden dentro de una partición.
Las mejores prácticas incluyen: empezar simple — utilizar Pub/Sub primero y sólo añadir CQRS o Event Sourcing cuando está justificado; invertir en un buen registro de esquemas; hacer cumplir colas de letras muertas para eventos fallidos; y simular fallos regularmente para asegurar su saga compensando trabajos de lógica.
Conclusión
Diseño de eventos y desarrollo de la tecnología de la nube de EDA, que es un diseño de la tecnología de la tecnología de la información y la tecnología de la información y la tecnología de la información, y que es un sistema de diseño de la tecnología de la información y la tecnología de la información y la tecnología de la información.