stringtranslate.com

Cola de mensajes

En informática , las colas de mensajes y los buzones de correo son componentes de ingeniería de software que normalmente se utilizan para la comunicación entre procesos (IPC) o para la comunicación entre subprocesos dentro del mismo proceso. Utilizan una cola para enviar mensajes  : pasar el control o el contenido. Los sistemas de comunicación grupal proporcionan tipos similares de funcionalidad.

El paradigma de la cola de mensajes es hermano del patrón editor/suscriptor y normalmente es una parte de un sistema middleware más amplio orientado a mensajes . La mayoría de los sistemas de mensajería admiten tanto el modelo de editor/suscriptor como el de cola de mensajes en su API , por ejemplo, Java Message Service (JMS).

El patrón de consumidores competidores permite que varios consumidores simultáneos procesen mensajes en la misma cola de mensajes. [1]

Mandato y propiedad

Las colas de mensajes implementan un patrón de comunicación asincrónica entre dos o más procesos/hilos mediante el cual la parte emisora ​​y la receptora no necesitan interactuar con la cola de mensajes al mismo tiempo. Los mensajes colocados en la cola se almacenan hasta que el destinatario los recupera. Las colas de mensajes tienen límites implícitos o explícitos sobre el tamaño de los datos que pueden transmitirse en un solo mensaje y la cantidad de mensajes que pueden permanecer pendientes en la cola. [2]

Remitir

Muchas implementaciones de colas de mensajes funcionan internamente dentro de un sistema operativo o dentro de una aplicación . Estas colas existen únicamente a los efectos de ese sistema . [3] [4] [5]

Otras implementaciones permiten el paso de mensajes entre diferentes sistemas informáticos, conectando potencialmente múltiples aplicaciones y múltiples sistemas operativos. [6] Estos sistemas de cola de mensajes normalmente proporcionan una funcionalidad de resiliencia para garantizar que los mensajes no se "pierdan" en caso de una falla del sistema. Ejemplos de implementaciones comerciales de este tipo de software de cola de mensajes (también conocido como middleware orientado a mensajes ) incluyen IBM MQ (anteriormente MQ Series) y Oracle Advanced Queuing (AQ). Existe un estándar de Java llamado Java Message Service , que tiene varias implementaciones de software libre y propietario .

Los sistemas operativos en tiempo real (RTOS), como VxWorks y QNX, fomentan el uso de colas de mensajes como mecanismo principal de comunicación entre procesos o entre subprocesos. Esto puede dar como resultado la integración entre el paso de mensajes y la programación de la CPU. Los primeros ejemplos de RTOS comerciales que fomentaban una base de cola de mensajes para la comunicación entre subprocesos también incluyen VRTX y pSOS +, ambos datan de principios de la década de 1980. El lenguaje de programación Erlang utiliza procesos para proporcionar concurrencia; Estos procesos se comunican de forma asincrónica mediante colas de mensajes.

Propiedad

El software de cola de mensajes puede ser propietario, de código abierto o una combinación de ambos. Luego se ejecuta localmente en servidores privados o en servidores en la nube externos ( servicio de cola de mensajes ).

Ejemplos de proveedores de middleware de mensajería basada en hardware son Solace , Apigee e IBM MQ .

Uso

En una implementación típica de colas de mensajes, un administrador del sistema instala y configura el software de colas de mensajes (un administrador de colas o un intermediario) y define una cola de mensajes con nombre. O se registran en un servicio de cola de mensajes .

Luego, una aplicación registra una rutina de software que "escucha" los mensajes colocados en la cola.

La segunda aplicación y las posteriores pueden conectarse a la cola y transferirle un mensaje.

El software del administrador de colas almacena los mensajes hasta que una aplicación receptora se conecta y luego llama a la rutina del software registrado. Luego, la aplicación receptora procesa el mensaje de manera adecuada.

A menudo existen numerosas opciones en cuanto a la semántica exacta del paso de mensajes, que incluyen:

Todas estas son consideraciones que pueden tener efectos sustanciales en la semántica de las transacciones, la confiabilidad y la eficiencia del sistema.

Estándares y protocolos

Históricamente, las colas de mensajes han utilizado protocolos cerrados propietarios, lo que restringe la capacidad de diferentes sistemas operativos o lenguajes de programación para interactuar en un conjunto heterogéneo de entornos.

Un primer intento de hacer que las colas de mensajes fueran más ubicuas fue la especificación JMS de Sun Microsystems , que proporcionaba una abstracción exclusiva de Java de una API de cliente . Esto permitió a los desarrolladores de Java cambiar entre proveedores de colas de mensajes de una manera similar a la de los desarrolladores que utilizan bases de datos SQL . En la práctica, dada la diversidad de técnicas y escenarios de colas de mensajes, esto no siempre fue tan práctico como podría ser.

Han surgido tres estándares que se utilizan en implementaciones de colas de mensajes de código abierto:

  1. Protocolo avanzado de cola de mensajes (AMQP): protocolo de cola de mensajes con muchas funciones, aprobado como ISO/IEC 19464 desde abril de 2014
  2. Protocolo de mensajería orientada a texto en streaming (STOMP): protocolo de mensajes simple y orientado a texto
  3. MQTT (anteriormente MQ Telemetry Transport): protocolo de cola de mensajes liviano, especialmente para dispositivos integrados

Estos protocolos se encuentran en diferentes etapas de estandarización y adopción. Los dos primeros operan al mismo nivel que HTTP , MQTT al nivel de TCP/IP .

Algunas implementaciones propietarias también utilizan HTTP para proporcionar colas de mensajes mediante algunas implementaciones, como SQS de Amazon . Esto se debe a que siempre es posible superponer el comportamiento asíncrono (que es lo que se requiere para la cola de mensajes) sobre un protocolo síncrono utilizando la semántica de solicitud-respuesta. Sin embargo, en este caso, dichas implementaciones están limitadas por el protocolo subyacente y es posible que no puedan ofrecer la fidelidad total o el conjunto de opciones requeridas en el paso de mensajes anterior.

Sincrónico versus asincrónico

Muchos de los protocolos de comunicaciones más conocidos que se utilizan funcionan de forma sincrónica . El protocolo HTTP, utilizado en la World Wide Web y en los servicios web  , ofrece un ejemplo obvio en el que un usuario envía una solicitud de una página web y luego espera una respuesta.

Sin embargo, existen escenarios en los que el comportamiento sincrónico no es apropiado. Por ejemplo, AJAX ( JavaScript y XML asincrónicos ) se puede utilizar para enviar de forma asincrónica mensajes de texto, JSON o XML para actualizar parte de una página web con información más relevante. Google utiliza este enfoque para su Google Suggest, una función de búsqueda que envía las consultas parcialmente escritas por el usuario a los servidores de Google y devuelve una lista de posibles consultas completas que el usuario podría estar interesado en el proceso de escritura. Esta lista se actualiza de forma asincrónica a medida que el usuario escribe.

Existen otros ejemplos asincrónicos en sistemas de notificación de eventos y sistemas de publicación/suscripción .

En los dos ejemplos anteriores, no tendría sentido que el remitente de la información tuviera que esperar si, por ejemplo, uno de los destinatarios hubiera fallado.

Las aplicaciones no necesitan ser exclusivamente síncronas o asíncronas. Es posible que una aplicación interactiva necesite responder a ciertas partes de una solicitud de inmediato (como decirle a un cliente que se ha aceptado una solicitud de venta y manejar la promesa de utilizar el inventario), pero puede poner en cola otras partes (como completar el cálculo de la facturación). , enviar datos al sistema de contabilidad central y solicitar todo tipo de otros servicios) que se realizará algún tiempo después.

En todo este tipo de situaciones, tener un subsistema que realice colas de mensajes (o, alternativamente, un sistema de transmisión de mensajes) puede ayudar a mejorar el comportamiento del sistema en general.

Implementación en UNIX

Hay dos implementaciones comunes de colas de mensajes en UNIX . Uno es parte de la API de SYS V, el otro es parte de POSIX .

SISTEMA V

UNIX SYS V implementa el paso de mensajes manteniendo una serie de listas enlazadas como colas de mensajes. Cada cola de mensajes se identifica por su índice en la matriz y tiene un descriptor único. Un índice determinado puede tener múltiples descriptores posibles. UNIX ofrece funciones estándar para acceder a la función de paso de mensajes. [7]

msgget()
Esta llamada al sistema toma una clave como argumento y devuelve un descriptor de la cola con la clave coincidente, si existe. Si no existe y la IPC_CREATbandera está configurada, crea una nueva cola de mensajes con la clave dada y devuelve su descriptor.
msgrcv()
Se utiliza para recibir un mensaje de un descriptor de cola determinado. El proceso que llama debe tener permisos de lectura para la cola. Es de dos tipos. [8]
  • El bloqueo de la recepción pone al niño a dormir si no puede encontrar el tipo de mensaje solicitado. Duerme hasta que se publica otro mensaje en la cola y luego se despierta para comprobarlo nuevamente.
  • La recepción sin bloqueo regresa inmediatamente a la persona que llama y menciona que falló.
msgctl()
Se utiliza para cambiar los parámetros de la cola de mensajes como el propietario. Lo más importante es que se utiliza para eliminar la cola de mensajes pasando la IPC_RMIDbandera. Sólo su creador, propietario o superusuario puede eliminar una cola de mensajes.

POSIX

La API de cola de mensajes POSIX.1-2001 es la última de las dos API de cola de mensajes UNIX. Es distinta de la API de SYS V, pero proporciona una función similar. La página de manual de Unix mq_overview(7)proporciona una descripción general de las colas de mensajes POSIX.

Interfaces gráficas de usuario

Las interfaces gráficas de usuario (GUI) emplean una cola de mensajes, también llamada cola de eventos o cola de entrada , para pasar acciones de entrada gráfica , como clics del mouse , eventos de teclado u otras entradas del usuario, al programa de aplicación . [9] El sistema de ventanas coloca mensajes que indican eventos del usuario u otros, como tics del temporizador o mensajes enviados por otros hilos, en la cola de mensajes. La aplicación GUI elimina estos eventos uno a la vez llamando a una rutina llamada getNextEvent()o similar en un bucle de eventos y luego llamando a la rutina de aplicación adecuada para procesar ese evento. [10]

Ver también

Referencias

  1. ^ Gorton, Ian. Fundamentos de sistemas escalables . Medios O'Reilly. ISBN 9781098106034.
  2. ^ Sumérgete en el módulo de cola en Python. Descripción general de las colas de mensajes POSIX
  3. ^ Colas de mensajes del sistema Win32. "Acerca de mensajes y colas de mensajes". Interfaz de usuario de Windows . Red de desarrolladores de Microsoft. Archivado desde el original el 17 de marzo de 2012 . Consultado el 21 de abril de 2010 .
  4. ^ Colas de mensajes de Linux y POSIX. Descripción general de las colas de mensajes POSIX Archivado el 4 de mayo de 2012 en Wayback Machine en linux.die.net
  5. ^ Uso de colas de mensajes de Linux. Funciones de la cola de mensajes de Linux Archivado el 8 de abril de 2012 en Wayback Machine en www.civilized.com
  6. ^ Por ejemplo, el producto MSMQ. "Cola de mensajes (MSMQ)". Red de comunicacion . Red de desarrolladores de Microsoft . Consultado el 9 de mayo de 2009 .
  7. ^ Bach, MJ (1986). El diseño del sistema operativo UNIX . Prentice Hall. ISBN 9780132017992.
  8. ^ Abraham Silberschatz, Peter B. Galvin (1994). Conceptos de sistemas operativos . Addison-Wesley. ISBN 9780201504804.
  9. ^ Carrete, Corky. "Programación GUI". Universidad Rice: Robert (Corky) Cartwright . Consultado el 27 de junio de 2020 .
  10. ^ Nystrom, Robert (2014). Patrones de programación de juegos. Geneve Benning. ISBN 978-0990582908. Consultado el 27 de junio de 2020 .