Estilo de arquitectura basada en eventosEvent-driven architecture style

Una arquitectura basada en eventos consta de productores de eventos que generan un flujo de eventos, y consumidores de eventos que escuchan los eventos.An event-driven architecture consists of event producers that generate a stream of events, and event consumers that listen for the events.

Diagrama de un estilo de arquitectura basada en eventos

Los eventos se entregan casi en tiempo real, de modo que los consumidores pueden responder inmediatamente a los eventos cuando se producen.Events are delivered in near real time, so consumers can respond immediately to events as they occur. Los productores se desconectan de los consumidores — un productor no sabe que los consumidores están escuchando.Producers are decoupled from consumers — a producer doesn't know which consumers are listening. Los consumidores también se desconectan entre sí, y cada consumidor ve todos los eventos.Consumers are also decoupled from each other, and every consumer sees all of the events. Esto difiere de un patrón Competing Consumers, donde los consumidores extraen los mensajes de una cola y los mensajes solo se procesan una vez (suponiendo que no haya errores).This differs from a Competing Consumers pattern, where consumers pull messages from a queue and a message is processed just once (assuming no errors). En algunos sistemas, como IoT, los eventos se deben ingerir en volúmenes muy altos.In some systems, such as IoT, events must be ingested at very high volumes.

Una arquitectura basada en eventos puede usar un modelo pub/sub o un modelo de flujo de eventos.An event driven architecture can use a pub/sub model or an event stream model.

  • Pub/sub: la infraestructura de mensajería mantiene el seguimiento de las suscripciones.Pub/sub: The messaging infrastructure keeps track of subscriptions. Cuando se publica un evento, se envía el evento a cada suscriptor.When an event is published, it sends the event to each subscriber. Después de que se recibe un evento, no se puede reproducir, y los nuevos suscriptores no ven el evento.After an event is received, it cannot be replayed, and new subscribers do not see the event.

  • Streaming de eventos: los eventos se escriben en un registro.Event streaming: Events are written to a log. Los eventos siguen un orden estricto (dentro de una partición) y son duraderos.Events are strictly ordered (within a partition) and durable. Los clientes no se suscriben al flujo, sino que un cliente puede leer desde cualquiera de sus partes.Clients don't subscribe to the stream, instead a client can read from any part of the stream. El cliente es responsable de avanzar su posición en el flujo.The client is responsible for advancing its position in the stream. Esto significa que un cliente puede unirse en cualquier momento y puede reproducir los eventos.That means a client can join at any time, and can replay events.

En el lado del consumidor, hay algunas variaciones comunes:On the consumer side, there are some common variations:

  • Procesamiento sencillo de eventos.Simple event processing. Un evento desencadena inmediatamente una acción en el consumidor.An event immediately triggers an action in the consumer. Por ejemplo, podría usar Azure Functions con un desencadenador de Service Bus para que una función se ejecute cada vez que se publica un mensaje en un tema de Service Bus.For example, you could use Azure Functions with a Service Bus trigger, so that a function executes whenever a message is published to a Service Bus topic.

  • Procesamiento de eventos complejos.Complex event processing. Un consumidor procesa una serie de eventos, en busca de patrones en los datos de eventos, mediante una tecnología como Azure Stream Analytics o Apache Storm.A consumer processes a series of events, looking for patterns in the event data, using a technology such as Azure Stream Analytics or Apache Storm. Por ejemplo, podría agregar las lecturas de un dispositivo insertado durante una ventana de tiempo y generar una notificación si la media móvil supera un umbral determinado.For example, you could aggregate readings from an embedded device over a time window, and generate a notification if the moving average crosses a certain threshold.

  • Procesamiento de flujo de eventos.Event stream processing. Use una plataforma de flujo de datos, como Azure IoT Hub o Apache Kafka, como canalización para ingerir eventos y suministrarlos a procesadores de flujo.Use a data streaming platform, such as Azure IoT Hub or Apache Kafka, as a pipeline to ingest events and feed them to stream processors. Los procesadores de flujos sirven para procesar o transformar el flujo.The stream processors act to process or transform the stream. Puede haber varios procesadores de flujo para diferentes subsistemas de la aplicación.There may be multiple stream processors for different subsystems of the application. Este enfoque es una buena opción para las cargas de trabajo de IoT.This approach is a good fit for IoT workloads.

El origen de los eventos puede ser externo con respecto al sistema, como dispositivos físicos en una solución de IoT.The source of the events may be external to the system, such as physical devices in an IoT solution. En ese caso, el sistema debe ser capaz de ingerir los datos según el volumen y el rendimiento que requiere el origen de datos.In that case, the system must be able to ingest the data at the volume and throughput that is required by the data source.

En el diagrama lógico anterior, se muestra cada tipo de consumidor como un solo cuadro.In the logical diagram above, each type of consumer is shown as a single box. En la práctica, es habitual tener varias instancias de un consumidor para evitar hacer que el consumidor se convierta en un único punto de error en el sistema.In practice, it's common to have multiple instances of a consumer, to avoid having the consumer become a single point of failure in system. También podrían ser necesarias varias instancias para administrar el volumen y la frecuencia de los eventos.Multiple instances might also be necessary to handle the volume and frequency of events. Además, un único consumidor podría procesar eventos en varios subprocesos.Also, a single consumer might process events on multiple threads. Esto puede crear dificultades si los eventos se deben procesar en orden o requieren la semántica de tipo "exactly-once".This can create challenges if events must be processed in order or require exactly-once semantics. Consulte Minimizar la coordinación.See Minimize Coordination.

Cuándo utilizar esta arquitecturaWhen to use this architecture

  • Varios subsistemas deben procesar los mismos eventos.Multiple subsystems must process the same events.
  • Procesamiento en tiempo real con retardo mínimo.Real-time processing with minimum time lag.
  • Procesamiento de eventos complejos, como coincidencia de patrones o agregación durante ventanas de tiempo.Complex event processing, such as pattern matching or aggregation over time windows.
  • Gran volumen y alta velocidad de datos, como IoT.High volume and high velocity of data, such as IoT.

VentajasBenefits

  • Se desvinculan productores y consumidores.Producers and consumers are decoupled.
  • No existen integraciones de punto a punto.No point-to-point integrations. Es fácil agregar nuevos consumidores al sistema.It's easy to add new consumers to the system.
  • Los consumidores pueden responder a eventos inmediatamente a medida que llegan.Consumers can respond to events immediately as they arrive.
  • Muy escalable y distribuida.Highly scalable and distributed.
  • Los subsistemas tienen vistas independientes del flujo de eventos.Subsystems have independent views of the event stream.

DesafíosChallenges

  • Entrega garantizada.Guaranteed delivery. En algunos sistemas, especialmente en escenarios de IoT, es fundamental garantizar la entrega de los eventos.In some systems, especially in IoT scenarios, it's crucial to guarantee that events are delivered.
  • Procesamiento de eventos en orden o exactamente una vez.Processing events in order or exactly once. Cada tipo de consumidor normalmente se ejecuta en varias instancias, a fin de conseguir resistencia y escalabilidad.Each consumer type typically runs in multiple instances, for resiliency and scalability. Esto puede suponer un desafío si se deben procesar los eventos en orden (dentro de un tipo de consumidor), o si la lógica de procesamiento no es idempotente.This can create a challenge if the events must be processed in order (within a consumer type), or if the processing logic is not idempotent.

Consideraciones adicionalesAdditional considerations

  • La cantidad de datos que se va a incluir en un evento puede ser una consideración importante que afecta al rendimiento y los costos.The amount of data to include in an event can be a significant consideration that affects both performance and cost. Incluir toda la información relevante que se necesita para el procesamiento en el propio evento permite simplificar el código de procesamiento y ahorrar búsquedas adicionales.Putting all the relevant information needed for processing in the event itself can simplify the processing code and save additional lookups. Si se incluye una cantidad mínima de información en un evento (por ejemplo, solo un par de identificadores), el tiempo de transporte y el costo se reducirán, pero será necesario que el código de procesamiento busque cualquier información adicional que necesite.Putting the minimal amount of information in an event, like just a couple of identifiers, will reduce transport time and cost, but requires the processing code to look up any additional information it needs. Para más información, eche un vistazo a esta entrada de blog.For more information on this, take a look at this blog post.