Selección de una entrega basada en mensajes con colas
Supongamos que va a planear la arquitectura de una aplicación para compartir música. Quiere asegurarse de que los archivos de música se carguen en la API web de forma confiable desde la aplicación móvil. A continuación, desea proporcionar los detalles sobre las nuevas canciones directamente a la aplicación cuando un artista agrega música nueva a su colección. Este escenario refleja un uso perfecto de un sistema basado en mensajes y Azure ofrece dos soluciones a este problema:
- Azure Queue Storage
- Azure Service Bus
¿Qué es Azure Queue Storage?
Queue Storage es un servicio que usa Azure Storage para almacenar grandes cantidades de mensajes a los que se puede acceder de forma segura desde cualquier lugar del mundo mediante una sencilla interfaz basada en REST. Las colas pueden contener millones de mensajes, limitados solamente por la capacidad de la cuenta de almacenamiento que las posea.
¿Qué son las colas de Azure Service Bus?
Service Bus es un sistema de agente de mensajes destinado a aplicaciones empresariales. A menudo, estas aplicaciones usan varios protocolos de comunicación, tienen otros contratos de datos y requisitos de seguridad más altos, y pueden incluir servicios en la nube y locales. Service Bus se basa en una infraestructura de mensajería dedicada diseñada exactamente para estos escenarios.
Ambos servicios se basan en la idea de una cola que contiene los mensajes enviados hasta que el destino está preparado para recibirlos.
¿Qué son los temas de Azure Service Bus?
Los temas de Azure Service Bus son similares a las colas, pero pueden tener varios suscriptores. Cuando un mensaje se envía a un tema en lugar de enviarlo a una cola, varios componentes se pueden desencadenar para hacer su trabajo. Imagina que un usuario escucha una canción en una aplicación para compartir música. La aplicación móvil podría enviar un mensaje al tema "Escuchado". Ese tema tendrá una suscripción para "UpdateUserListenHistory" y otra suscripción para "UpdateArtistsFanList". Cada una de estas funciones está bajo el control de un componente distinto que recibe su propia copia del mensaje.
Internamente, los temas usan colas. Cuando se hace una publicación en un tema, el mensaje se copia y coloca en la cola correspondiente a cada suscripción. La cola significa que la copia del mensaje se mantendrá cerca para su procesamiento por parte de cada rama de suscripción incluso si el componente que procesa esa suscripción está demasiado ocupado como para mantener el ritmo.
Ventajas de las colas
Las infraestructuras de las colas pueden admitir muchas características avanzadas que hacen que sean útiles como se indica a continuación:
Mayor confiabilidad
Las aplicaciones distribuidas usan las colas como una ubicación de almacenamiento temporal para los mensajes pendientes de entrega a un componente de destino. El componente de origen puede agregar un mensaje a la cola y los componentes de destino pueden recuperarlo en la parte delantera de la cola para su procesamiento. Las colas aumentan la confiabilidad del intercambio de mensajes porque, en los momentos de gran demanda, los mensajes pueden esperar a que un componente de destino esté listo para procesarlos.
Garantías de entrega de mensajes
Los sistemas de colas generalmente garantizan la entrega de cada mensaje de la cola a un componente de destino. Pero estas garantías pueden adoptar enfoques diferentes:
Entrega al menos una vez: en este enfoque, se garantiza la entrega de cada mensaje al menos a uno de los componentes que recuperan los mensajes de la cola. Pero tenga en cuenta que, en determinadas circunstancias, puede que el mismo mensaje se entregue más de una vez. Por ejemplo, si hay dos instancias de una aplicación web que recupera mensajes de una cola, normalmente cada mensaje va solo a una de esas instancias. Sin embargo, si una instancia tarda mucho tiempo en procesar el mensaje y se agota el tiempo de espera, puede que también se envíe a la otra instancia. El código de la aplicación web se debe diseñar con esta posibilidad en mente.
Entrega como máximo una vez: en este enfoque, no se garantiza la entrega de todos los mensajes y hay pocas probabilidades de que no lleguen. Pero, a diferencia de la entrega Al menos una vez, no existe la posibilidad de que el mensaje se entregue dos veces. Esto se denomina a veces detección de duplicados automática.
Primero en caducar primero en salir (FIFO): en la mayoría de los sistemas de mensajería, los mensajes normalmente dejan la cola en el mismo orden en que se agregaron, pero debe considerar si se garantiza esta entrega. Si la aplicación distribuida requiere que los mensajes se procesen precisamente en el orden correcto, debe elegir un sistema de cola que incluya una garantía FIFO.
Compatibilidad transaccional
Algunos grupos de mensajes estrechamente relacionados pueden causar problemas cuando se produce un error en la entrega de un mensaje de cualquiera de ellos.
Por ejemplo, piense en una aplicación de comercio electrónico. Cuando el usuario selecciona el botón Comprar, es posible que se genere una serie de mensajes y que se envíen a varios destinos de procesamiento:
- Se envía un mensaje con los detalles del pedido a un centro de entregas.
- Se envía un mensaje con los detalles de pago y el total a un procesador de tarjetas de crédito.
- Se envía un mensaje con la información de confirmación a una base de datos para generar una factura para el cliente.
En este caso, queremos asegurarnos de que se procesen todos los mensajes, o bien ninguno de ellos. El negocio no durará mucho si el mensaje de la tarjeta de crédito no se entrega y todos los pedidos se completan sin pagarse. Puede evitar estos tipos de problemas mediante la agrupación de los dos mensajes en una transacción. Las transacciones de mensajes se realizan correctamente o con errores como una sola unidad, como sucede con las bases de datos. Si se produce un error en la entrega del mensaje de los detalles de la tarjeta de crédito, se producirá también con el mensaje de los detalles del pedido.
¿Qué servicio debo elegir?
Una vez haya entendido que la estrategia de comunicación para esta arquitectura debe ser un mensaje, debe elegir si usar las colas de Azure Storage o Azure Service Bus. Puede usar ambas tecnologías para almacenar y entregar mensajes entre los componentes. Cada uno tiene un conjunto de características ligeramente diferente, lo que significa que puede elegir uno u otro, o usar los dos, según el problema que se va a resolver.
Use las colas de Service Bus si:
- Necesita una garantía de entrega Como máximo una vez.
- Necesita una garantía FIFO.
- Necesita agrupar los mensajes en transacciones.
- Quiere recibir mensajes sin sondear la cola.
- Necesita proporcionar un modelo de acceso basado en roles a las colas.
- Necesita controlar mensajes mayores de 64 KB, pero menores de 100 MB. El tamaño máximo de mensaje admitido por el nivel estándar es de 256 KB y por el nivel Premium es de 100 MB.
- El tamaño de la cola no aumentará más allá de 1 TB. El tamaño máximo de cola para el nivel estándar es de 80 GB y para el nivel Premium es de 1 TB.
- Desea publicar y consumir lotes de mensajes.
Use los temas de Service Bus si:
- Necesita todas las características que ofrecen las colas de Service Bus y, además, implementar un patrón pub-sub en el que los mensajes se puedan enrutar a una de las múltiples suscripciones, cada una con sus propios receptores independientes
El almacenamiento en colas no tiene tantas características, pero si no necesita ninguna de ellas, puede ser una opción más sencilla. Además, es la mejor solución si la aplicación tiene cualquiera de los requisitos siguientes.
Use Queue Storage si:
- Necesita un registro de auditoría de todos los mensajes que pasan por la cola.
- La previsión es que la cola supere el tamaño de 1 TB.
- Quiere realizar el seguimiento del progreso para procesar un mensaje dentro de la cola.
Una cola es una ubicación de almacenamiento temporal simple para los mensajes enviados entre los componentes de una aplicación distribuida. Puede usar una cola para organizar los mensajes y controlar correctamente los aumentos impredecibles de la demanda.
Use las colas de Storage si quiere disponer de un sistema de cola sencillo y fácil de codificar. Para las necesidades más avanzadas, use las colas de Service Bus. Si tiene varios destinos para un mismo mensaje, pero necesita un comportamiento similar a las colas, use los temas de Service Bus.