VENTAS: 1-800-867-1389

Crear aplicaciones que usan los temas y suscripciones de Service Bus

Actualizado: octubre de 2014

Autor: David Ingham

Revisores: Seth Manheim

La versión de septiembre de 2011 de Microsoft Azure Service Bus agregó un nuevo conjunto de tecnologías de software intermedio orientado a mensajes basadas en la nube, incluida la puesta en cola de mensajes confiables y la mensajería de publicación/suscripción durable. Este artículo desarrolla la información incluida en Crear aplicaciones que usan colas de Service Bus y presenta una introducción a las capacidades de publicación/suscripción ofrecidas por los temas de CmdLets. En este artículo no se pretende cubrir todas las características de CmdLets. Sin embargo, proporcionara suficiente información para empezar a usar esta nueva característica.

Este artículo continúa el escenario de venta directa que se utiliza en Crear aplicaciones que usan colas de Service Bus. Recuerde que los datos de venta de los terminales individuales de Puntos de venta (TPV) deben dirigirse a un sistema de administración del inventario que utiliza esos datos para determinar cuándo deben reponerse existencias. Cada terminal de punto de venta informa de sus datos de venta enviando mensajes a la cola de DataCollectionQueue, donde permanecen hasta que los recibe el sistema de administración de inventario, tal como se muestra a continuación:

Bus-del-servicio1

Para desarrollar el escenario, se ha agregado un nuevo requisito al sistema: El propietario de la tienda quiere poder supervisar el rendimiento de la tienda en tiempo real.

Para tratar el requisito, el sistema debe “cerrar” el flujo de datos de ventas. Aún queremos que cada mensaje enviado por los terminales de punto de venta se envíen al sistema de administración del inventario como antes pero queremos otra copia de cada mensaje para usarla para presentar la vista del panel de información al propietario d la tienda.

En cualquier situación similar a esta, en que necesita que cada mensaje sea consumido por varias partes, puede usar la característica tema de CmdLets. Los temas proporcionan un modelo de publicación/suscripción en que cada mensaje publicado se pone a disposición de una o más suscripciones registradas con el tema. En cambio, con las colas, los mensajes son recibidos por un solo consumidor.

Los mensajes se envían a un tema del mismo modo que se envían a a una cola. Sin embargo, los mensajes no se reciben del tema directamente; se reciben de las suscripciones. Puede considerar una suscripción a un tema como una cola virtual que recibe copias de los mensajes enviados a ese tema. Los mensajes se reciben de una suscripción del mismo modo que se reciben de una cola.

Volviendo al escenario, lo primero es cambiar la cola para un tema y agregar una suscripción que usará el componente Sistema de administración de inventario. El sistema aparece ahora como se muestra a continuación:

Bus-del-servicio2

En este punto la configuración tiene un rendimiento idéntico al del diseño basado en colas anterior. Es decir, los mensajes enviados al tema se dirigen a la suscripción Inventario, desde la cual los consume el Sistema de administración del inventario.

A fin de admitir el panel de administración, debemos crear una segunda suscripción en el tema, tal como se muestra a continuación:

Bus-del-servicio3

Con esta configuración, cada mensaje de los terminales de punto de venta está disponible para las suscripciones Panel de información e Inventario.

Crear aplicaciones que usan colas de Service Bus describe cómo registrarse en una cuenta de CmdLets y crear un espacio de nombres de servicio. Para usar el espacio de nombres de servicio de CmdLets, una aplicación debe hacer referencia al ensamblado de CmdLets, específicamente Microsoft.ServiceBus.dll. Puede encontrar este ensamblado como parte del SDK de en las bibliotecas de cliente de para .NET. En el momento de esta edición, la versión actual es 1.6, lanzada en noviembre de 2011. La descarga está disponible en la página de descarga del SDK de Azure.

Las operaciones de administración para entidades de mensajería de CmdLets (colas y temas de publicación/suscripción) se realizan a través de la clase NamespaceManager. CmdLets utiliza un modelo de seguridad basado en notificaciones implementado mediante el Active Directory Access Control de Microsoft Azure (también conocido como Access Control Service o ACS). Son necesarias las credenciales adecuadas para crear una instancia de NamespaceManager para un espacio de nombres de servicio determinado. La clase TokenProvider representa un proveedor de tokens de seguridad con métodos de fábrica integrados que devuelven algunos proveedores de tokens bien conocidos. Utilizaremos una clase SharedSecretTokenProvider para almacenar las credenciales secretas compartidas y manejar la adquisición de los tokens adecuados de ACS. La instancia de NamespaceManager se crea entonces con la dirección base del CmdLets espacio de nombres de servicio y el proveedor de tokens.

La clase NamespaceManager proporciona métodos para crear, enumerar y eliminar entidades de mensajería. El fragmento que se muestra aquí indica cómo se crea y se utiliza la instancia de NamespaceManager para crear el tema DataCollectionTopic.

Uri uri = ServiceBusEnvironment.CreateServiceUri("sb", "ingham-blog", string.Empty);
    string name = "owner";
    string key = "abcdefghijklmopqrstuvwxyz";
     
    TokenProvider tokenProvider = TokenProvider.CreateSharedSecretTokenProvider(name, key);
    NamespaceManager namespaceManager = new NamespaceManager(uri, tokenProvider);
 
    namespaceManager.CreateTopic("DataCollectionTopic");

Recuerde que hay sobrecargas del método CreateTopic que permiten establecer las propiedades del tema. Por ejemplo, puede establecer el valor de período de vida (TTL) predeterminado para mensajes enviados al tema. A continuación, agregue las suscripciones de Inventario y Panel de información.

namespaceManager.CreateSubscription("DataCollectionTopic", "Inventory");
    namespaceManager.CreateSubscription("DataCollectionTopic", "Dashboard");

Para operaciones de tiempo de ejecución en entidades de CmdLets; por ejemplo, enviar y recibir mensajes, una aplicación tiene que crear primero un objeto de MessagingFactory. De forma parecida a la clase NamespaceManager, la instancia de MessagingFactory se crea a partir de la dirección base del espacio de nombres de servicio y el proveedor de tokens.

MessagingFactory factory = MessagingFactory.Create(uri, tokenProvider);

Los mensajes enviados a y recibidos de los temas de CmdLets son instancias de la clase BrokeredMessage. Esta clase consta de un conjunto de propiedades estándar (como Label y TimeToLive), un diccionario que se utiliza para almacenar propiedades de la aplicación y un cuerpo de datos de aplicación arbitrarios. Una aplicación puede establecer el cuerpo pasando cualquier objeto serializable (el siguiente ejemplo pasa un objeto SalesData que representa los datos de venta del terminal de punto de venta), que utilizará el DataContractSerializer para serializar el objeto. De forma alternativa, se puede proporcionar un Stream.

BrokeredMessage bm = new BrokeredMessage(salesData);
    bm.Label = "SalesReport";
    bm.Properties["StoreName"] = "Redmond";
    bm.Properties["MachineID"] = "POS_1";

La manera más sencilla de enviar mensajes al tema es usar CreateMessageSender para crear un objeto MessageSender directamente desde la instancia de MessagingFactory.

MessageSender sender = factory.CreateMessageSender("DataCollectionQueue");
    sender.Send(bm);

De manera similar al uso de las colas, la forma más sencilla de recibir mensajes de una suscripción es usar un objeto MessageReceiver que puede crear directamente desde laMessagingFactory mediante CreateMessageReceiver. Puede usar uno de los dos modos de recepción distintos (ReceiveAndDelete y PeekLock), tal como se trata en Crear aplicaciones que usan colas de Service Bus.

Tenga en cuenta que cuando crea un MessageReceiver para suscripciones, el parámetro entityPath tiene la forma topicPath/subscriptions/subscriptionName. Por lo tanto, para crear un MessageReceiver para la suscripción Inventario del tema DataCollectionTopic, entityPath debe ser DataCollectionTopic/subscriptions/Inventory. El código aparece como se indica a continuación:

MessageReceiver receiver = factory.CreateMessageReceiver("DataCollectionTopic/subscriptions/Inventory");
    BrokeredMessage receivedMessage = receiver.Receive();
    try
    {
        ProcessMessage(receivedMessage);
        receivedMessage.Complete();
    }
    catch (Exception e)
    {
        receivedMessage.Abandon();
    }

Hasta ahora, en este artículo todos los mensajes enviados al tema están disponibles para todas las suscripciones registradas. La frase clave es “puesto a disposición”. Si bien las suscripciones de CmdLets ven todos los mensajes enviados al tema, solo puede copiar un subconjunto de los mensajes en la cola de suscripción virtual. Esto se lleva a cabo con filtros de suscripción. Al crear una suscripción, puede proporcionar una expresión de filtro en la forma de un predicado de estilo SQL92 que opera en las propiedades del mensaje, tanto las propiedades del sistema (por ejemplo, Label) como las propiedades de la aplicación, como StoreName en el ejemplo anterior.

A fin de desarrollar el escenario para ilustrar esta explicación, se debe agregar una segunda tienda a nuestro escenario de venta directa. Los datos de ventas de todos los terminales de puntos de venta de las dos tiendas aún se tienen que dirigir al sistema de administración del inventario centralizado pero un jefe de tienda que usa la herramienta del panel de información solo está interesado en el rendimiento de esa tienda. Para conseguirlo, puede usar el filtrado de suscripción. Tenga en cuenta que cuando los terminales del punto de venta publican mensajes, establecen la propiedad de la aplicación StoreName en el mensaje. Teniendo en cuenta dos tiendas, por ejemplo, Redmond y Seattle, los terminales de punto de venta de la tienda de Redmond marcan los mensajes de datos de ventas con un StoreName igual a Redmond, mientras que los terminales de punto de venta de la tienda deSeattle usan un StoreName igual a Seattle. El jefe de tienda de la tienda Redmond solo quiere ver datos de sus terminales de punto de venta. El sistema aparece como se muestra a continuación:

Bus-del-servicio-4

Para configurar el enrutamiento, debe crear la suscripción Panel de información como se indica a continuación:

SqlFilter dashboardFilter = new SqlFilter("StoreName = ‘Redmond’");
  namespaceManager.CreateSubscription("DataCollectionTopic", "Dashboard", dashboardFilter);

Con este filtro de suscripción, solo los mensajes que tienen la propiedad StoreName establecida en Redmond se copiarán a la cola virtual para la suscripción Panel de información. Hay mucho más que explicar sobre el filtrado de suscripción. Las aplicaciones pueden tener varias reglas de filtro por suscripción además de la capacidad de modificar las propiedades de un mensaje cuando este pasa a una cola virtual de la suscripción.

En este artículo se muestra cómo empezar a usar la característica de publicación/suscripción basada en temas que se presenta en CmdLets.

Todas las razones para usar la puesta en cola descrita en Crear aplicaciones que usan colas de Service Bus también se aplican a los temas, concretamente:

  • Desacoplamiento temporal: los productores y consumidores de mensajes no tienen que estar en línea al mismo tiempo.

  • Nivelado de carga: los picos de la carga son atenuados por el tema que habilita el consumo de aplicaciones que se aprovisionan para la carga media en lugar de para un pico de carga.

  • Equilibrio de carga: de forma similar a una cola, puede tener varios consumidores en competencia escuchando una sola suscripción, con cada mensaje entregado solamente a uno de los consumidores de modo que se equilibra la carga.

  • Acoplamiento flexible: puede desarrollar la red de mensajería sin que ello afecte a los extremos existentes; por ejemplo, agregando suscripciones o cambiando filtros en un tema para permitir nuevos consumidores.

¿Te ha resultado útil?
(Caracteres restantes: 1500)
Gracias por sus comentarios
Mostrar:
© 2014 Microsoft