Escritura de código para enviar y recibir mensajes mediante un tema
En una aplicación distribuida, algunos mensajes se deben enviar a un único componente de destinatario. Otros mensajes deben llegar a más de un destino.
Considere lo que sucede cuando un usuario cancela el pedido de una bicicleta. La cancelación de un pedido difiere ligeramente de la realización de un pedido inicial. Cuando se realiza un pedido, el flujo de trabajo espera hasta que el pedido borra el procesamiento del pago antes de enviar el pedido a la tienda local. Para la operación de cancelación, enviaremos la notificación a la tienda y al procesador del pago al mismo tiempo. Este enfoque minimiza las posibilidades de que el repartidor pierda tiempo para la entrega.
Para permitir que varios componentes reciban el mismo mensaje, usará un tema de Azure Service Bus. A continuación, verá el proceso y las consideraciones al escribir el código.
Código con temas frente a código con colas
Si quiere que todos los mensajes enviados se entreguen a todos los componentes suscritos, use temas. Escribir código que usa temas es una forma de reemplazar a las colas. Usará el mismo paquete NuGet Azure.Messaging.ServiceBus, configurará cadenas de conexión y usará patrones de programación asincrónicos.
También va a usar las mismas clases ServiceBusClient
y ServiceBusSender
para enviar mensajes y la clase ServiceBusProcessor
para recibirlos.
Establecimiento de filtros en las suscripciones
Si quiere que determinados mensajes enviados al tema se entreguen a una suscripción específica, puede colocar uno o varios filtros en la suscripción del tema. Por ejemplo, en la aplicación de bicicletas, las tiendas ejecutan aplicaciones de la Plataforma universal de Windows (UWP). Cada tienda puede suscribirse al tema OrderCancellation
y filtrar por su propio StoreId
. Ahorra ancho de banda de Internet porque no se envían mensajes innecesarios a varias ubicaciones de almacén. Por otra parte, el componente de procesamiento de pagos se suscribe a todos los mensajes de OrderCancellation
.
Los filtros pueden ser de tres tipos:
- Filtros booleanos:
TrueFilter
garantiza que todos los mensajes enviados al tema se entreguen a la suscripción actual.FalseFilter
garantiza que ninguno de los mensajes enviados se entregue a la suscripción actual. (Esto bloquea o desactiva la suscripción de forma eficaz). - Filtros de SQL: Un filtro de SQL especifica una condición con la misma sintaxis que una cláusula
WHERE
en una consulta SQL. Solo los mensajes que devuelvenTrue
, cuando se evalúan con respecto a este filtro, se entregan a los suscriptores. - Filtros de correlación: Un filtro de correlación contiene un conjunto de condiciones que se comparan con las propiedades de cada mensaje. Si la propiedad del filtro y la propiedad del mensaje tienen el mismo valor, se considera una coincidencia.
Para el filtro StoreId
, podría usar un filtro de SQL. Los filtros de SQL son los más flexibles, aunque también los más costosos, y el filtro puede ralentizar el rendimiento de Service Bus. En este caso, se elige un filtro de correlación.
Para enviar un mensaje a un tema
Para enviar un mensaje a un tema, completará los pasos siguientes.
En cualquier componente de envío o recepción, agregue las instrucciones using
siguientes a todos los archivos de código que llamen a un tema de Service Bus.
using System.Threading;
using System.Threading.Tasks;
using Azure.Messaging.ServiceBus;
Para enviar un mensaje, empiece por crear un objeto ServiceBusClient
y pasarle la cadena de conexión y el nombre del tema.
await using var client = new ServiceBusClient(connectionString);
A continuación, cree un objeto ServiceBusSender
invocando el método CreateSender
en el objeto ServiceBusClient
y especificando el nombre del tema.
ServiceBusSender sender = client.CreateSender(topicName);
Para enviar un mensaje al tema, llame al método ServiceBusSender.SendMessageAsync()
y pase ServiceBusMessage
. Como sucede con una cola, el mensaje debe tener formato de cadena codificada en UTF-8.
string message = "Cancel! I have changed my mind!";
var message = new ServiceBusMessage(message);
// Send the message to the topic.
await sender.SendMessageAsync(message);
Para recibir mensajes de una suscripción
Para recibir un mensaje de una suscripción, debe crear un objeto ServiceBusProcessor
y pasarle el nombre del tema y el nombre de la suscripción.
processor = client.CreateProcessor(topicName, subscriptionName, options);
Luego registre un controlador de mensajes y un controlador de errores.
// Specify the handler method for messages.
processor.ProcessMessageAsync += MessageHandler;
// Specify the handler method for errors.
processor.ProcessErrorAsync += ErrorHandler;
Realice el trabajo de procesamiento en el controlador de mensajes y, a continuación, llame al método ProcessMessageEventArgs.CompleteMessageAsync()
para quitar el mensaje de la suscripción.
// Complete the message. The message is deleted from the subscription.
await args.CompleteMessageAsync(args.Message);