En informática , las colas de mensajes y los buzones de correo son componentes de ingeniería de software que se utilizan normalmente para la comunicación entre procesos (IPC) o para la comunicación entre subprocesos dentro del mismo proceso. Usan una cola para enviar mensajes : el paso del control o del contenido. Los sistemas de comunicación grupal proporcionan tipos de funcionalidad similares.
El paradigma de la cola de mensajes es un hermano del patrón de editor / suscriptor y, por lo general, es una parte de un sistema de middleware orientado a mensajes más grande . La mayoría de los sistemas de mensajería dan soporte tanto al editor / suscriptor como a los modelos de cola de mensajes en su API , por ejemplo, Java Message Service (JMS).
Remisión y propiedad
Las colas de mensajes implementan un patrón de comunicación asíncrono entre dos o más procesos / subprocesos por el cual la parte emisora y receptora no necesitan interactuar con la cola de mensajes al mismo tiempo. Los mensajes que se colocan 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 el número de mensajes que pueden permanecer pendientes en la cola. [1]
Remitir
Muchas implementaciones de colas de mensajes funcionan internamente dentro de un sistema operativo o dentro de una aplicación . Estas colas existen únicamente para los fines de ese sistema . [2] [3] [4]
Otras implementaciones permiten el paso de mensajes entre diferentes sistemas informáticos, conectando potencialmente múltiples aplicaciones y múltiples sistemas operativos. [5] Estos sistemas de cola de mensajes generalmente brindan una funcionalidad de resistencia 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 serie MQ) y Oracle Advanced Queueing (AQ). Existe un estándar de Java llamado Java Message Service , que tiene varias implementaciones de software patentado y gratuito .
Los sistemas operativos en tiempo real (RTOS) como VxWorks y QNX fomentan el uso de la cola de mensajes como el mecanismo principal de comunicación entre procesos o entre subprocesos. Esto puede resultar en la integración entre el paso de mensajes y la programación de la CPU. Los primeros ejemplos de los RTOS comerciales que alentaron una base de mensajes en cola para la comunicación entre hilos también incluyen VRTX y de pSOS +, ambos de los cuales datan de la década de 1980. El lenguaje de programación Erlang utiliza procesos para proporcionar simultaneidad; estos procesos se comunican de forma asincrónica mediante la puesta en cola 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 en las instalaciones en servidores privados o en servidores en la nube externos ( servicio de cola de mensajes ).
- Las opciones patentadas tienen el historial más largo e incluyen productos desde el inicio de la cola de mensajes, como IBM MQ , y aquellos vinculados a sistemas operativos específicos, como Microsoft Message Queue Server (MSMQ) . Los proveedores de servicios en la nube también proporcionan sus soluciones patentadas, como Amazon Simple Queue Service (SQS), StormMQ , Solace e IBM MQ .
- Las opciones de código abierto de sistemas de middleware de mensajería incluyen Apache ActiveMQ , Apache Kafka , Apache Qpid , Apache RocketMQ , Enduro / X , JBoss Messaging , JORAM , RabbitMQ , Sun Open Message Queue y Tarantool .
Algunos 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 puesta en cola de mensajes, un administrador del sistema instala y configura el software de puesta en cola de mensajes (un gestor de colas o 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 siguientes pueden conectarse a la cola y transferir un mensaje a ella.
El software del administrador de colas almacena los mensajes hasta que una aplicación receptora se conecta y luego llama a la rutina de software registrada. La aplicación receptora procesa el mensaje de manera apropiada.
A menudo, existen numerosas opciones en cuanto a la semántica exacta del paso de mensajes, que incluyen:
- Durabilidad: los mensajes pueden guardarse en la memoria, escribirse en el disco o incluso enviarse a un DBMS si la necesidad de confiabilidad indica una solución más intensiva en recursos.
- Políticas de seguridad: ¿qué aplicaciones deberían tener acceso a estos mensajes?
- Políticas de depuración 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 mensajes que coincidan con algunos criterios de interés preespecificados
- Políticas de envío: ¿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 deberían recibir un mensaje o los mensajes de una cola?
- Políticas de lotes: ¿deben entregarse los mensajes de inmediato? ¿O debería el sistema esperar un poco e intentar entregar muchos mensajes a la vez?
- Criterios de cola: ¿cuándo debe considerarse un mensaje "en cola"? ¿Cuando una cola lo tiene? ¿O cuando se ha reenviado a al menos una cola remota? ¿O a todas las colas?
- Notificación de recepción: es posible que un editor necesite 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 confiabilidad del sistema y la eficiencia del sistema.
Estándares y protocolos
Históricamente, la cola de mensajes ha utilizado protocolos cerrados y propietarios, lo que restringe la capacidad de los diferentes sistemas operativos o lenguajes de programación para interactuar en un conjunto heterogéneo de entornos.
Un primer intento de hacer que la cola de mensajes sea más ubicua fue la especificación JMS de Sun Microsystems , que proporcionaba una abstracción de una API de cliente únicamente en Java . Esto permitió a los desarrolladores de Java cambiar entre proveedores de cola 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 puesta en cola 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:
- Protocolo de cola de mensajes avanzado (AMQP): protocolo de cola de mensajes con muchas funciones, aprobado como ISO / IEC 19464 desde abril de 2014
- Streaming Text Oriented Messaging Protocol (STOMP): protocolo de mensajes simple y orientado a texto
- 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 la cola de mensajes por algunas implementaciones, tales como Amazon 's SQS . 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 semántica de solicitud-respuesta. Sin embargo, tales implementaciones están limitadas por el protocolo subyacente en este caso y es posible que no puedan ofrecer la fidelidad total o el conjunto de opciones requeridas en el paso de mensajes anterior.
Sincrónico vs asincrónico
Muchos de los protocolos de comunicaciones más conocidos que se utilizan funcionan sincrónicamente . 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 síncrono no es apropiado. Por ejemplo, AJAX ( Asynchronous JavaScript and XML ) 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 sugerencia de Google, una función de búsqueda que envía las consultas del usuario parcialmente mecanografiadas 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 .
- 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 lea cualquier número de clientes.
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 asincrónicas. Una aplicación interactiva puede necesitar 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 facturación , reenviar datos al sistema de contabilidad central y solicitar todo tipo de otros servicios) que se realizará algún tiempo después.
En todos estos tipos de situaciones, tener un subsistema que realiza 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
Hay dos implementaciones de colas de mensajes comunes en UNIX . Uno es parte de la API SYS V, el otro es parte de POSIX .
SYS V
UNIX SYS V implementa el paso de mensajes manteniendo una matriz 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 dado puede tener múltiples descriptores posibles. UNIX ofrece funciones estándar para acceder a la función de paso de mensajes. [6]
msgget()
- Esta llamada al sistema toma una clave como argumento y devuelve un descriptor de la cola con la clave correspondiente, si existe. Si no existe y la
IPC_CREAT
bandera está activada, 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 de la persona que llama debe tener permisos de lectura para la cola. Es de dos tipos. [7]
- El bloqueo de 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 verificar nuevamente.
- La recepción sin bloqueo regresa inmediatamente a la persona que llama, mencionando que falló.
msgctl()
- Se usa 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_RMID
bandera. 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 última de las dos API de cola de mensajes de UNIX. Es diferente 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 . [8] El sistema de ventanas coloca los mensajes que indican al usuario u otros eventos, como los tics del temporizador o los 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 apropiada para procesar ese evento. [9]
Ver también
- Protocolo de cola de mensajes avanzado (AMQP)
- Servicio de cola simple de Amazon
- Apache ActiveMQ
- Apache Qpid
- Apio (software)
- Gearman
- IBM Integration Bus
- IBM MQ
- Servicio de mensajes Java
- MQTT
- Middleware orientado a mensajes , (categoría)
- Microsoft Message Queue Server (conocido coloquialmente como MSMQ)
- NATS
- Servicio de Oracle Messaging Cloud
- RabbitMQ
- Redis
- StormMQ , un ejemplo de servicio de cola de mensajes
- Servicio de mensajes empresariales TIBCO
- Plataforma Enduro / X Middleware
- ZeroMQ
Referencias
- ^ Sumérjase en el módulo de cola 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 desde el 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 demayo de 2012 en Wayback Machine en linux.die.net
- ^ Uso de colas de mensajes de Linux. Funciones de cola de mensajes de Linux Archivado 2012-04-08 en Wayback Machine en www.civilized.com
- ^ Por ejemplo, el producto MSMQ. "Message Queue Server (MSMQ)" . Comunicación en red . Red de desarrolladores de Microsoft . Consultado el 9 de mayo de 2009 .
- ^ Bach, MJ El diseño del sistema operativo UNIX . ISBN 9780132017992.
- ^ Abraham Silberschatz, Peter B. Galvin. Conceptos de sistemas operativos . ISBN 9780201504804.
- ^ Cartwright, Corky. "Programación GUI" . Universidad de Rice: Robert (Corky) Cartwright . Consultado el 27 de junio de 2020 .
- ^ Nystrom, Robert (2014). Patrones de programación de juegos . ISBN 978-0990582908. Consultado el 27 de junio de 2020 .