En informática , las colas de mensajes y los buzones de correo son componentes de ingeniería de software que se utilizan habitualmente para la comunicación entre procesos (IPC) o entre hilos dentro del mismo proceso. Utilizan una cola para la mensajería : el traspaso de control o de contenido. Los sistemas de comunicación de grupo ofrecen funcionalidades similares.
El paradigma de cola de mensajes es similar al patrón publicador/suscriptor y suele formar parte de un sistema de middleware orientado a mensajes más amplio . La mayoría de los sistemas de mensajería admiten tanto el modelo publicador/suscriptor como el de cola de mensajes en su API , por ejemplo, Java Message Service (JMS).
El patrón de consumidores competitivos permite que múltiples consumidores simultáneos procesen mensajes en la misma cola de mensajes. [ 1 ]
Remisión y propiedad
Las colas de mensajes implementan un patrón de comunicación asíncrona entre dos o más procesos/hilos, de modo que el emisor y el receptor no necesitan interactuar con la cola de mensajes simultáneamente. 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 en el tamaño de los datos que se pueden transmitir en un solo mensaje y en 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 . Dichas colas existen únicamente para los fines de ese sistema . [ 3 ] [ 4 ] [ 5 ]
Otras implementaciones permiten el intercambio de mensajes entre diferentes sistemas informáticos, conectando potencialmente múltiples aplicaciones y sistemas operativos. [ 6 ] Estos sistemas de colas de mensajes suelen proporcionar funcionalidad de resiliencia para garantizar que los mensajes no se "pierdan" en caso de fallo del sistema. Ejemplos de implementaciones comerciales de este tipo de software de colas 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 cuenta con varias implementaciones de software propietario y gratuito .
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 hilos. Esto puede dar lugar a la integración entre el paso de mensajes y la planificación de la CPU. Entre los primeros ejemplos de RTOS comerciales que promovían una comunicación entre hilos basada en colas de mensajes se encuentran VRTX y pSOS +, ambos 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 asíncrona mediante colas de mensajes.
Propiedad
El software de cola de mensajes puede ser propietario, de código abierto o una combinación de ambos. Se ejecuta en servidores privados locales o en servidores en la nube externos ( servicio de cola de mensajes ).
- Las opciones propietarias tienen la trayectoria más larga e incluyen productos desde los inicios de las colas de mensajes, como IBM MQ , y aquellos vinculados a sistemas operativos específicos, como Microsoft Message Queuing (MSMQ) . Los proveedores de servicios en la nube también ofrecen sus soluciones propietarias, como Amazon Simple Queue Service (SQS), StormMQ, Solace e IBM MQ .
- Entre las opciones de código abierto para sistemas de middleware de mensajería se incluyen Apache ActiveMQ , Apache Kafka , Apache Qpid , Apache RocketMQ , JBoss Messaging , RabbitMQ , Sun Open Message Queue y Tarantool .
Algunos ejemplos de proveedores de middleware de mensajería basado 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 gestor de colas o intermediario) y define una cola de mensajes con nombre. O bien, se registra en un servicio de colas de mensajes .
A continuación, la aplicación registra una rutina de software que "escucha" los mensajes colocados en la cola.
Las aplicaciones posteriores pueden conectarse a la cola y transferir un mensaje a ella.
El software gestor de colas almacena los mensajes hasta que una aplicación receptora se conecta y, a continuación, llama a la rutina de software registrada. La aplicación receptora procesa entonces el mensaje de la manera adecuada.
A menudo existen numerosas opciones en cuanto a la semántica exacta del paso de mensajes, entre las que se incluyen:
- Durabilidad: los mensajes pueden mantenerse en la memoria, escribirse en el disco o incluso confirmarse en un sistema de gestión de bases de datos (DBMS) si la necesidad de fiabilidad exige una solución que requiera más recursos.
- Políticas de seguridad: ¿qué aplicaciones deberían tener acceso a estos mensajes?
- Políticas de purga de mensajes: las colas o los mensajes pueden tener un " tiempo de vida ".
- Filtrado de mensajes: algunos sistemas admiten el filtrado de datos para que un suscriptor solo vea los mensajes que coincidan con ciertos criterios de interés predefinidos.
- Políticas de entrega: ¿debemos garantizar que un mensaje se entregue al menos una vez, o no más de una vez?
- Políticas de enrutamiento: en un sistema con muchos servidores de cola, ¿qué servidores deben recibir un mensaje o los mensajes de una cola?
- Políticas de procesamiento por lotes: ¿deben entregarse los mensajes inmediatamente? ¿O debería el sistema esperar un poco e intentar entregar varios mensajes a la vez?
- Criterios de encolamiento: ¿cuándo se considera que un mensaje está "en cola"? ¿Cuando una cola lo tiene? ¿O cuando se ha reenviado al menos a una cola remota? ¿O a todas las colas?
- Notificación de recepción: un editor puede necesitar saber cuándo algunos o todos los suscriptores han recibido un mensaje.
Todas estas son consideraciones que pueden tener efectos sustanciales en la semántica de las transacciones, la fiabilidad del sistema y la eficiencia del sistema.
Normas y protocolos
Históricamente, las colas de mensajes han utilizado protocolos propietarios y cerrados, 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 por popularizar las colas de mensajes fue la especificación JMS de Sun Microsystems , que proporcionaba una abstracción exclusiva para Java de una API de cliente . Esto permitía a los desarrolladores de Java alternar entre proveedores de colas de mensajes de forma similar a como lo hacen 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 resultaba tan práctico como podría haber sido.
Han surgido tres estándares que se utilizan en las implementaciones de colas de mensajes de código abierto:
- Protocolo avanzado de cola de mensajes (AMQP): protocolo de cola de mensajes con numerosas funciones, aprobado como ISO/IEC 19464 desde abril de 2014.
- Protocolo de mensajería orientado a texto en tiempo real (STOMP): protocolo de mensajería simple y orientado a texto.
- MQTT (anteriormente MQ Telemetry Transport): protocolo de cola de mensajes ligero especialmente diseñado 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 , mientras que MQTT lo hace al nivel de TCP/IP .
Algunas implementaciones propietarias también utilizan HTTP para proporcionar colas de mensajes, como en el caso de SQS de Amazon . Esto se debe a que siempre es posible superponer un comportamiento asíncrono (necesario para las colas de mensajes) sobre un protocolo síncrono mediante 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 o el conjunto completo de opciones necesarias para el paso de mensajes.
Síncrono vs. asíncrono
Muchos de los protocolos de comunicación más conocidos funcionan de forma síncrona . El protocolo HTTP , utilizado en la World Wide Web y en los servicios web , ofrece un ejemplo claro: un usuario envía una solicitud de una página web y espera una respuesta.
Sin embargo, existen situaciones en las que el comportamiento síncrono no es apropiado. Por ejemplo, AJAX ( Asynchronous JavaScript and XML ) se puede usar para enviar mensajes de texto, JSON o XML de forma asíncrona y así actualizar parte de una página web con información más relevante. Google utiliza este enfoque para su función Google Suggest, una herramienta 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 podrían interesarle mientras escribe. Esta lista se actualiza de forma asíncrona a medida que el usuario escribe.
Existen otros ejemplos asíncronos en los sistemas de notificación de eventos y en los sistemas de publicación/suscripción .
- Una aplicación puede necesitar notificar a otra que ha ocurrido un evento, pero no necesita esperar una respuesta.
- En los sistemas de publicación/suscripción, una aplicación "publica" información para que la lean varios clientes.
En ambos ejemplos anteriores, no tendría sentido que el remitente de la información tuviera que esperar si, por ejemplo, uno de los destinatarios hubiera sufrido una avería.
Las aplicaciones no tienen por qué ser exclusivamente síncronas o asíncronas. Una aplicación interactiva puede necesitar responder a ciertas partes de una solicitud de inmediato (como informar a un cliente que se ha aceptado una solicitud de venta y gestionar 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 llamar a otros servicios) para que se realicen más adelante.
En todas estas situaciones, contar con un subsistema que gestione la puesta en cola de mensajes (o, alternativamente, un sistema de mensajería de difusión) puede ayudar a mejorar el comportamiento del sistema en general.
Implementación en UNIX
En UNIX existen dos implementaciones comunes de colas de mensajes . Una forma parte de la API SYS V y la otra forma parte de POSIX .
SISTEMA V
UNIX SYS V implementa el paso de mensajes mediante el uso de una matriz de listas enlazadas que funcionan como colas de mensajes. Cada cola de mensajes se identifica por su índice en la matriz y tiene un descriptor único. Un índice dado puede tener varios descriptores posibles. UNIX proporciona funciones estándar para acceder a la función de paso de mensajes. [ 7 ]
msgget()- Esta llamada al sistema recibe una clave como argumento y devuelve un descriptor de la cola con la clave correspondiente, si existe. Si no existe y el
IPC_CREATindicador está activado, crea una nueva cola de mensajes con la clave proporcionada y devuelve su descriptor. msgrcv()- Se utiliza para recibir un mensaje de un descriptor de cola determinado. El proceso que realiza la llamada debe tener permisos de lectura para la cola. Existen dos tipos. [ 8 ]
- El bloqueo de recepción pone al proceso hijo en modo de suspensión si no encuentra el tipo de mensaje solicitado. Permanece en suspensión hasta que se publica otro mensaje en la cola y, a continuación, se activa para volver a comprobarlo.
- La recepción no bloqueante devuelve inmediatamente la llamada al emisor, indicando que ha fallado.
msgctl()- Se utiliza para modificar 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 un
IPC_RMIDindicador. Una cola de mensajes solo puede ser eliminada por su creador, propietario o superusuario.
POSIX
La API de cola de mensajes POSIX.1-2001 es la más reciente de las dos API de cola de mensajes de UNIX. Es distinta de la API SYS V, pero ofrece funciones similares. La página man 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 ratón , 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 eventos, como pulsos de temporizador o mensajes enviados por otros subprocesos, en la cola de mensajes. La aplicación GUI elimina estos eventos uno a uno llamando a una rutina llamada getNextEvent()o similar en un bucle de eventos , y luego llamando a la rutina de aplicación apropiada para procesar ese evento. [ 10 ]
Véase también
- Protocolo avanzado de colas de mensajes (AMQP)
- Servicio de cola simple de Amazon
- Apache ActiveMQ
- Apache Qpid
- Apio (software)
- Gearman
- IBM Integration Bus
- IBM MQ
- Servicio de mensajería Java
- MQTT
- Middleware orientado a mensajes , (categoría)
- Cola de mensajes de Microsoft (conocida coloquialmente como MSMQ)
- NATS
- Servicio de mensajería en la nube de Oracle
- RabbitMQ
- Redis
- Servicio de mensajería empresarial TIBCO
- ZeroMQ
Referencias
- ↑ Gorton, Ian (2022). Fundamentos de sistemas escalables . O'Reilly Media. ISBN 9781098106034.
- ↑ Introducción al módulo Queue en Python. Descripción general de las colas de mensajes POSIX.
- ↑ Colas de mensajes del sistema Win32. "Acerca de los mensajes y las colas de mensajes" . Interfaz de usuario de Windows . Red de desarrolladores de Microsoft. Archivado del original el 17 de marzo de 2012. Consultado el 21 de abril de 2010 .
- ↑ 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
- ↑ Uso de colas de mensajes de Linux. Funciones de colas de mensajes de Linux . Archivado el 8 de abril de 2012 en Wayback Machine en www.civilized.com
- ↑ Por ejemplo, el producto MSMQ. "Message Queuing (MSMQ)" . Comunicación de red . Microsoft Developer Network . Consultado el 9 de mayo de 2009 .
- ↑ Bach, MJ (1986). El diseño del sistema operativo UNIX . Prentice-Hall. ISBN 9780132017992.
- ↑ Abraham Silberschatz, Peter B. Galvin (1994). Conceptos de sistemas operativos . Addison-Wesley. ISBN 9780201504804.
- ↑ Cartwright, Corky. "Programación de GUI" . Universidad Rice: Robert (Corky) Cartwright . Consultado el 27 de junio de 2020 .
- ↑ Nystrom, Robert (2014). Patrones de programación de juegos . Genever Benning. ISBN 978-0990582908. Consultado el 27 de junio de 2020 .
- Comunicación entre procesos
- Eventos (informática)
- Gestión de colas