stringtranslate.com

Arquitectura basada en eventos

La arquitectura basada en eventos ( EDA ) es un paradigma de arquitectura de software relacionado con la producción y detección de eventos .

Descripción general

Un evento se puede definir como "un cambio significativo de estado ". [1] Por ejemplo, cuando un consumidor compra un automóvil, el estado del automóvil cambia de "en venta" a "vendido". La arquitectura del sistema de un concesionario de automóviles puede tratar este cambio de estado como un evento cuya ocurrencia puede darse a conocer a otras aplicaciones dentro de la arquitectura. Desde una perspectiva formal, lo que se produce, publica, propaga, detecta o consume es un mensaje (normalmente asíncrono) llamado notificación de evento, y no el evento en sí, que es el cambio de estado que desencadenó la emisión del mensaje. Los acontecimientos no viajan, simplemente ocurren. Sin embargo, el término evento se utiliza a menudo metonímicamente para indicar el mensaje de notificación en sí, lo que puede generar cierta confusión. Esto se debe a que las arquitecturas basadas en eventos a menudo se diseñan sobre arquitecturas basadas en mensajes , donde dicho patrón de comunicación requiere que una de las entradas sea solo texto, el mensaje, para diferenciar cómo se debe manejar cada comunicación.

Este patrón arquitectónico puede aplicarse mediante el diseño y la implementación de aplicaciones y sistemas que transmiten eventos entre componentes y servicios de software débilmente acoplados . Un sistema controlado por eventos normalmente consta de emisores (o agentes) de eventos, consumidores (o receptores) de eventos y canales de eventos. Los emisores tienen la responsabilidad de detectar, recopilar y transferir eventos. Un emisor de eventos no conoce a los consumidores del evento, ni siquiera sabe si existe un consumidor y, en caso de que exista, no sabe cómo se utiliza o procesa el evento. Los sumideros tienen la responsabilidad de aplicar una reacción tan pronto como se presenta un evento. La reacción puede o no ser proporcionada completamente por el propio fregadero. Por ejemplo, el receptor podría tener simplemente la responsabilidad de filtrar, transformar y reenviar el evento a otro componente o podría proporcionar una reacción autónoma a dicho evento. Los canales de eventos son conductos en los que los eventos se transmiten desde los emisores de eventos a los consumidores de eventos. El conocimiento de la correcta distribución de los eventos está presente exclusivamente dentro del canal de eventos. [ cita requerida ] La implementación física de los canales de eventos puede basarse en componentes tradicionales como middleware orientado a mensajes o comunicación punto a punto, lo que podría requerir un marco ejecutivo transaccional más apropiado [ aclarar ] .

La construcción de sistemas en torno a una arquitectura basada en eventos simplifica la escalabilidad horizontal en los modelos informáticos distribuidos y los hace más resistentes a los fallos. Esto se debe a que el estado de la aplicación se puede copiar en varias instantáneas paralelas para lograr una alta disponibilidad. [2] Se pueden iniciar nuevos eventos en cualquier lugar, pero lo más importante es que se propagan a través de la red de almacenes de datos y se actualizan a medida que llegan. Agregar nodos adicionales también se vuelve trivial: simplemente puede tomar una copia del estado de la aplicación, alimentarla con un flujo de eventos y ejecutarla. [3]

La arquitectura basada en eventos puede complementar la arquitectura orientada a servicios (SOA) porque los servicios pueden activarse mediante activadores activados ante eventos entrantes. [4] [5] Este paradigma es particularmente útil cuando el sumidero no proporciona ningún ejecutivo autónomo [ aclarar ] .

SOA 2.0 evoluciona las implicaciones que brindan las arquitecturas SOA y EDA a un nivel más rico y sólido al aprovechar relaciones causales previamente desconocidas para formar un nuevo patrón de eventos. [ vago ] Este nuevo patrón de inteligencia empresarial desencadena un mayor procesamiento humano o automatizado autónomo que agrega valor exponencial a la empresa al inyectar información de valor agregado en el patrón reconocido que no podría haberse logrado anteriormente. [ impreciso ]

Estructura del evento

Un evento puede constar de dos partes: el encabezado del evento y el cuerpo del evento. El encabezado del evento puede incluir información como el nombre del evento, la marca de tiempo del evento y el tipo de evento. El cuerpo del evento proporciona los detalles del cambio de estado detectado. El cuerpo de un evento no debe confundirse con el patrón o la lógica que puede aplicarse en reacción a la ocurrencia del evento en sí.

Capas de flujo de eventos

Una arquitectura impulsada por eventos puede construirse en cuatro capas lógicas, comenzando con la percepción de un evento (es decir, un estado o hecho temporal significativo), pasando por la creación de su representación técnica en la forma de una estructura de evento y terminando con una -Conjunto vacío de reacciones ante ese evento. [6]

Productor de eventos

La primera capa lógica es el productor de eventos, que detecta un hecho y lo representa como un mensaje de evento. A modo de ejemplo, un productor de eventos podría ser un cliente de correo electrónico, un sistema de comercio electrónico, un agente de seguimiento o algún tipo de sensor físico.

Convertir los datos recopilados de un conjunto tan diverso de fuentes de datos en una única forma estandarizada de datos para su evaluación es una tarea importante en el diseño e implementación de esta primera capa lógica. [6] Sin embargo, considerando que un evento es un marco fuertemente declarativo, cualquier operación informativa se puede aplicar fácilmente, eliminando así la necesidad de un alto nivel de estandarización. [ cita necesaria ]

Canal de eventos

Esta es la segunda capa lógica. Un canal de eventos es un mecanismo de propagación de la información recopilada desde un generador de eventos al motor de eventos [6] o receptor. Podría ser una conexión TCP/IP o cualquier tipo de archivo de entrada (plano, formato XML, correo electrónico, etc.). Se pueden abrir varios canales de eventos al mismo tiempo. Normalmente, debido a que el motor de procesamiento de eventos tiene que procesarlos casi en tiempo real, los canales de eventos se leerán de forma asincrónica. Los eventos se almacenan en una cola, a la espera de ser procesados ​​más tarde por el motor de procesamiento de eventos.

Motor de procesamiento de eventos

El motor de procesamiento de eventos es la capa lógica responsable de identificar un evento y luego seleccionar y ejecutar la reacción adecuada. También puede desencadenar una serie de afirmaciones. Por ejemplo, si el evento que llega al motor de procesamiento de eventos es un ID de producto con pocas existencias, esto puede desencadenar reacciones como "Pedir ID de producto" y "Notificar al personal". [6]

Actividad descendente impulsada por eventos

Esta es la capa lógica donde se muestran las consecuencias del evento. Esto se puede hacer de muchas maneras y formas diferentes; por ejemplo, se envía un correo electrónico a alguien y una aplicación puede mostrar algún tipo de advertencia en la pantalla. [6] Dependiendo del nivel de automatización proporcionado por el sumidero (motor de procesamiento de eventos), es posible que la actividad posterior no sea necesaria.

Estilos de procesamiento de eventos

Hay tres estilos generales de procesamiento de eventos: simple, continuo y complejo. Los tres estilos se utilizan a menudo juntos en una arquitectura madura basada en eventos. [6]

Procesamiento de eventos simple

El procesamiento de eventos simple se refiere a eventos que están directamente relacionados con cambios de condición específicos y mensurables. En el procesamiento de eventos simple, ocurre un evento notable que inicia acciones posteriores. El procesamiento de eventos simple se utiliza comúnmente para impulsar el flujo de trabajo en tiempo real, reduciendo así el tiempo de demora y los costos. [6]

Por ejemplo, se pueden crear eventos simples mediante un sensor que detecta cambios en la presión de los neumáticos o la temperatura ambiente. La presión incorrecta de los neumáticos del coche generará un simple evento del sensor que activará una luz amarilla que avisará al conductor sobre el estado de un neumático.

Procesamiento de flujo de eventos

En el procesamiento de flujo de eventos (ESP), ocurren tanto eventos ordinarios como notables. Los eventos ordinarios (órdenes, transmisiones RFID) se analizan para determinar su notoriedad y se transmiten a los suscriptores de información. El procesamiento de flujo de eventos se utiliza comúnmente para impulsar el flujo de información en tiempo real dentro y alrededor de la empresa, lo que permite la toma de decisiones a tiempo. [6]

Procesamiento de eventos complejos

El procesamiento de eventos complejos (CEP) permite considerar patrones de eventos simples y ordinarios para inferir que ha ocurrido un evento complejo. El procesamiento de eventos complejos evalúa una confluencia de eventos y luego toma medidas. Los eventos (notables u ordinarios) pueden cruzar tipos de eventos y ocurrir durante un largo período de tiempo. La correlación de eventos puede ser causal, temporal o espacial. CEP requiere el empleo de intérpretes de eventos sofisticados, definición y comparación de patrones de eventos y técnicas de correlación. CEP se utiliza comúnmente para detectar y responder a anomalías, amenazas y oportunidades comerciales. [6]

Procesamiento de eventos en línea

El procesamiento de eventos en línea (OLEP) utiliza registros de eventos distribuidos asíncronos para procesar eventos complejos y administrar datos persistentes. [7] OLEP permite componer de manera confiable eventos relacionados de un escenario complejo en sistemas heterogéneos. De este modo, permite patrones de distribución muy flexibles con alta escalabilidad y ofrece una gran coherencia. Sin embargo, no puede garantizar límites superiores en el tiempo de procesamiento.

Acoplamiento extremadamente flojo y bien distribuido.

Una arquitectura basada en eventos está muy poco acoplada y bien distribuida. La gran distribución de esta arquitectura existe porque un evento puede ser casi cualquier cosa y existir casi en cualquier lugar. La arquitectura está muy poco acoplada porque el evento en sí mismo no conoce las consecuencias de su causa. Por ejemplo, si tenemos un sistema de alarma que registra información cuando se abre la puerta principal, la puerta en sí no sabe que el sistema de alarma agregará información cuando se abra la puerta, solo que la puerta se ha abierto. [6]

Acoplamiento semántico y futuras investigaciones.

Las arquitecturas basadas en eventos tienen un acoplamiento flexible en el espacio, el tiempo y la sincronización, lo que proporciona una infraestructura escalable para el intercambio de información y flujos de trabajo distribuidos. Sin embargo, las arquitecturas de eventos están estrechamente acopladas, a través de suscripciones y patrones de eventos, a la semántica del esquema y los valores de eventos subyacentes. El alto grado de heterogeneidad semántica de los eventos en implementaciones grandes y abiertas, como las ciudades inteligentes y la red de sensores, dificulta el desarrollo y mantenimiento de sistemas basados ​​en eventos. Para abordar el acoplamiento semántico dentro de sistemas basados ​​en eventos, el uso de coincidencia semántica aproximada de eventos es un área activa de investigación. [8]

Implementaciones y ejemplos

Columpio Java

La API Java Swing se basa en una arquitectura basada en eventos. Esto funciona particularmente bien con la motivación detrás de Swing de proporcionar componentes y funcionalidades relacionados con la interfaz de usuario. La API utiliza una convención de nomenclatura (por ejemplo, "ActionListener" y "ActionEvent") para relacionar y organizar eventos. Una clase que necesita estar al tanto de un evento particular simplemente implementa el detector apropiado, anula los métodos heredados y luego se agrega al objeto que activa el evento. Un ejemplo muy sencillo podría ser:

clase pública FooPanel extiende JPanel implementa ActionListener { público FooPanel () { super ();            JButton btn = nuevo JButton ( "¡Haz clic en mí!" ); por cierto . addActionListener ( este );      este . agregar ( pulsar ); }  @Override public void actionPerformed ( ActionEvent ae ) { System . afuera . println ( "¡Se ha hecho clic en el botón!" ); } }       

Alternativamente, otra opción de implementación es agregar el oyente al objeto como una clase anónima y así usar la notación lambda (desde Java 1.8). A continuación se muestra un ejemplo.

clase pública FooPanel extiende JPanel { público FooPanel () { super ();          JButton btn = nuevo JButton ( "¡Haz clic en mí!" ); por cierto . addActionListener ( ae -> System . out . println ( "¡Se ha hecho clic en el botón!" )); este . agregar ( pulsar ); } }         

javascript

(() => { 'usar estricto' ;    clase EventEmitter { constructor () { este . eventos = nuevo mapa (); }          on ( evento , oyente ) { if ( tipo de oyente ! == 'función' ) { throw new TypeError ( 'El oyente debe ser una función' ); } dejar que los oyentes = esto . eventos . obtener ( evento ); if ( ! oyentes ) { oyentes = nuevo conjunto (); este . eventos . conjunto ( evento , oyentes ); } oyentes . agregar ( oyente ); devolver esto ; }                                off ( evento , oyente ) { if ( ! argumentos . longitud ) { this . eventos . claro (); } else if ( argumentos . longitud === 1 ) { this . eventos . eliminar ( evento ); } else { const oyentes = esto . eventos . obtener ( evento ); if ( oyentes ) { oyentes . eliminar ( oyente ); } } devolver esto ; }                               emitir ( evento , ... args ) { const oyentes = esto . eventos . obtener ( evento ); if ( oyentes ) { for ( let escucha de oyentes ) { oyente . aplicar ( esto , argumentos ); } } devolver esto ; } }                        este . Emisor de eventos = Emisor de eventos ; })();  

Uso:

eventos constantes = nuevo EventEmitter (); eventos . on ( 'foo' , () => { consola.log ( ' foo' ); } ); eventos . emitir ( 'foo' ); // Imprime eventos "foo" . apagado ( 'foo' ); eventos . emitir ( 'foo' ); // Nada pasará           

Objeto Pascal

Los eventos son uno de los elementos fundamentales del lenguaje Object Pascal . Aquí se utiliza el modelo unicast (uno a uno), es decir, el remitente envía información a un solo destinatario. Esta limitación tiene la ventaja de que no necesita un detector de eventos especial. El evento en sí es un puntero a un método en otro objeto. Si el puntero no está vacío, cuando ocurre un evento, se llama al controlador de eventos. Los eventos se usan comúnmente en clases que admiten GUI. Sin embargo, este no es el único ámbito de aplicación para eventos. El siguiente código es un ejemplo del uso de eventos:

unidad MiClasePersonalizada ;  interfazutiliza clases ; escriba {definición de su propio evento} TAccidentEvent = procedimiento ( Remitente : TObject ; const AValue : Integer ) del objeto ;             TMyCustomObject = clase ( TObject ) privada FData : Entero ; // un ejemplo de un campo simple en una clase FOnAccident : TAccidentEvent ; // evento - referencia a un método en algún objeto FOnChange : TNotifyEvent ; // evento-referencia a un método en algún procedimiento de objeto SetData ( Valor : Entero ) ; // un método que establece el valor de un campo en el procedimiento protegido de clase DoAccident ( const AValue : Integer ) ; virtual ; // un método que genera un evento basado en tu propio procedimiento de definición DoChange ; // un método que genera un evento basado en una definición del constructor público de la biblioteca VCL Create ; virtual ; // constructor de clases destructor Destruir ; anular ; // propiedad publicada del destructor de clase Datos : TAccidentEvent leer FData escribir SetData ; // declaración de una propiedad en una clase propiedad OnAccident : TAccidentEvent leer FOnAccident escribir FOnAccident ; // exponer el evento fuera de la propiedad de clase OnChange : TNotifyEvent leer FOnChange escribir FOnChange ; // exponiendo el evento fuera del procedimiento de clase MultiplyBy ( const AValue : Integer ) ; // un método que utiliza su propia definición del fin del evento ; implementación                                                                   constructor TMyCustomObject . Crear ; comenzar FData : = 0 ; fin ;    destructor TMyCustomObject . Destruir ; comenzar FData : = 0 ; heredado Destruir ; fin ;      procedimiento TMyCustomObject . DoAccident ( const AValue : Entero ) ; comenzar si está asignado ( FOnAccident ) y luego FOnAccident ( Self , AValue ) ; fin ;        procedimiento TMyCustomObject . Hacer cambio ; comenzar si está asignado ( FOnChange ) y luego FOnChange ( Self ) ; fin ;     procedimiento TMyCustomObject . Multiplicar por ( const AValue : entero ) ; comenzar FData := FData * AValue ; si FData > 1000000 entonces DoAccident ( FData ) ; fin ;              procedimiento TMyCustomObject . SetData ( Valor : Entero ) ; comience si FData <> Valor y luego comience FData := Valor ; Hacer cambio ; fin ; fin .             

La clase creada se puede utilizar de la siguiente manera:

... procedimiento TMyForm . ShowCustomInfo ( Remitente : TObject ) ; comience si el remitente es TMyCustomObject y luego ShowMessage ( 'Los datos han cambiado' ) ; fin ;        procedimiento TMyForm . PerformAcident ( Remitente : TObject ; const AValue : Entero ) ; comience si el remitente es TMyCustomObject y luego ShowMessage ( '¡Los datos han excedido 1000000! El nuevo valor es:' + AValue . ToString ) ; fin ; ... {declarar una variable que es un objeto de la clase especificada} var LMyObject : TMyCustomObject ; ... {creación del objeto} LMyObject := TMyCustomObject . Crear ; ... {asignar métodos a eventos} LMyObject . AlCambiar := MiForma . Mostrar información personalizada ; LMiObjeto . En caso de accidente : = Mi formulario . Realizar accidente ; ... {eliminar un objeto cuando ya no es necesario} LMyObject . Gratis ; ...                       

Ver también

Artículos

Referencias

  1. ^ K. Mani Chandy Aplicaciones impulsadas por eventos: costos, beneficios y enfoques de diseño, Instituto de Tecnología de California , 2006
  2. ^ Martin Fowler, Búsqueda de eventos, diciembre de 2005
  3. ^ Martin Fowler, Modelo paralelo, diciembre de 2005
  4. ^ Hanson, Jeff (31 de enero de 2005). "Servicios basados ​​en eventos en SOA". Mundo Java . Consultado el 21 de julio de 2020 .
  5. ^ Sliwa, Carol (12 de mayo de 2003). "Arquitectura basada en eventos preparada para una amplia adopción". Mundo de la informática . Consultado el 21 de julio de 2020 .
  6. ^ abcdefghij Brenda M. Michelson, Descripción general de la arquitectura basada en eventos, Patricia Seybold Group , 2 de febrero de 2006
  7. ^ "Procesamiento de eventos en línea: cola ACM". cola.acm.org . Consultado el 30 de mayo de 2019 .
  8. ^ Hasan, Souleiman, Sean O'Riain y Edward Curry. 2012. "Coincidencia semántica aproximada de eventos heterogéneos". En la Sexta Conferencia Internacional ACM sobre Sistemas Distribuidos Basados ​​en Eventos (DEBS 2012), 252–263. Berlín, Alemania: ACM. “DOI”.

enlaces externos