Siguiendo con la entrada anterior en la que empezábamos haciendo un pequeño repaso al API de service bus en .NET y el de las novedades sobre Queues y brokered messages, hablaremos sobre una de esas características que nos pueden ser de una extrema utilidad en ciertas ocasiones. Me refiero a la capacidad de detectar duplicados de mensajes.
Para intentar explicar mejor el porque de esta excelente característica pensemos en el siguiente ejemplo. Tenemos un sistema que nos permite monitorizar los contadores de rendimiento de un determinado equipo, de tal forma que, cuando un contador de rendimiento, por ejemplo uso de CPU, supera un valor dado, este sistema incluye en una cola de Service Bus un mensaje de alerta. Lógicamente, dispondremos de una pieza leyendo estos mensajes de alertar para, por ejemplo, enviar un correo notificando el problema. Dado este ejemplo, seguro que se dará cuenta de que podemos tener un problema y es que, si por ejemplo un equipo hace un uso intensivo de CPU lo hará por un tiempo determinado no en un solo instante. Por eso, si nuestro sistema de monitorización lee el valor de contador cada poco tiempo podríamos “inundar” el sistema de alarmas. Para evitar este problema, técnicamente conocido como flooding, podríamos tratar de utilizar la técnica anterior, haciendo que todas los mensajes iguales en la cola durante un determinado periodo se consideraran duplicados y por lo tanto se eliminaran automáticamente.
Configuración de la cola
Para poder utilizar la característica de duplicaciones lo primero que tenemos que hacer es disponer de una cola que soporte esta característica, a continuación, en las siguientes lineas de código podemos ver un ejemplo de creación y setup de una cola, fíjese en las propiedades RequiresDuplicateDetection y DuplicateDetectionHistoryTimeWindow.
1 2 3 4 5 6 7 8 9 10 11 12 |
<span class="rem">//set up queue</span> var queueDescription = <span class="kwrd">new</span> QueueDescription(<span class="str">"samples"</span>); <span class="rem">//enable duplicate detection</span> queueDescription.RequiresDuplicateDetection = <span class="kwrd">true</span>; <span class="rem">//set the time-window for duplicate messages detection</span> queueDescription.DuplicateDetectionHistoryTimeWindow = <span class="kwrd">new</span> TimeSpan(0, 5, 0); <span class="rem">//create the queue using the namespace manager</span> <span class="rem">//the connection string to service bus is </span> <span class="rem">//recovered from appsetttings "Microsoft.ServiceBusConnectionString" key</span> var namespaceManager = NamespaceManager.Create(); namespaceManager.CreateQueue(queueDescription); |
El trabajo
Bien, ahora que tenemos creada una cola con soporte para la detección de duplicados, la pregunta es : ¿ cómo interpreta Service Bus que dos mensajes son iguales ? Pues bien, la respuesta es mediante la propiedad MessageId de nuestra clase BrokeredMessage. Si, probablemente a todos nos gustaría poder utilizar algún sistema más sotisficado, o cuanto menos, algún sistema personalizable para realizar esta tarea pero desgraciadamente no parece existir. Si nos fueramos al ejemplo comentado anteriormente, no nos quedaría mas remedio que todas las alertas de un contador ( hablamos de CPU en el ejemplo ) tuvieran un mismo identificador. En el siguiente ejemplo vemos unas pequeñas lineas, a modo demostrativo, el envío de un nuevo mensage con su identificador establecido, de acuerdo a nuestro ejemplo:
1 2 3 4 |
var cpuAlertMessage = <span class="kwrd">new</span> BrokeredMessage(<span class="str">"the cpu use is greater than 85 %"</span>); cpuAlertMessage.MessageId = <span class="str">"CPU/counter"</span>; queue.Send(cpuAlertMessage); |
1 |
|
Bueno, hasta aquí ha llegado esta pequeña entrada. Espero que os resulte de interés.
Saludos
unai
Bueno, con esta cerraremos la pequeña serie sobre colas en Service Bus, después de las dos entradas anterior
En las entradas anteriores ( I , II y III ) vimos una pequeña introducción a las colas de Service Bus