Viernes, 14 de mayo de 2004
Colas en .NET
Hay quienes no saben qué es MSMQ o cómo accederlo desde .NET.
No puedo decir que me haya sorprendido el comentario de un amigo que preguntó en un curso oficial Microsoft dado por un socio de negocios para educación, de qué se trata MSMQ y el instructor no le supo contestar.
Para peor, hay que decir que lejos de inventarlos MS, los mecanismos de colas han existido por décadas en sistemas operativos host.
En la era de Internet es probable que te toque crear aplicaciones de concurrencia masiva y justamente las colas se inventaron para simplificar ese tipo de aplicaciones.
Una cola se parece a una casilla de correo electrónico, donde los mensajes son enviados y recibidos por aplicaciones (no por usuarios). Tal como en el caso del correo electrónico, la preocupación de quien escribe un mensaje llega hasta el punto de dejarlo en el servidor más cercano; ese servidor se encargará de llevar el mensaje a destino cuando la red lo permita, o anunciar el fallo si por mucho tiempo no ha sido posible.
El punto clave es la posibilidad de que el destinatario no esté en "atendiendo," "encendido," en el instante en que el mensaje es enviado: en ese momento puede ser que la red experimente problemas, o que el servicio se encuentre en mantenimiento, de alguna manera fuera de servicio.
Cuando las condiciones vuelvan a ser favorables, el mensaje llegará a destino y hará que el servicio ejecute el pedido que se le haya encomendado, posiblemente generando una respuesta.
MSMQ es el sistema de colas ofrecido por Microsoft. Para empezar a trabajar con él, conviene asegurarse que uno tiene Active Directory instalado y verificar que a su vez, la instalación de MSMQ corresponda a la modalidad AD (no Workgroup). De este modo se obtendrá acceso a colas públicas y se crearán correctamente las colas de salida, autenticación, transacciones y otros beneficios.
Quien recibe una primera introducción al tema de colas, tiende a pensar que se trata de una mecánica aplicable a pocos casos de conexión. Sin embargo, si lo pensás con detenimiento, el beneficio de trabajar con mensajes se expande a un número de casos bastante amplio.
En el libro Advanced Messaging Applications with MSMQ and MQSeries, Rhys Lewis clasifica los usos de colas en cinco patrones, a saber.
* Consulta asíncrona: la operación no modifica el estado de la aplicación (es una consulta), y su resolución no se necesita de manera inmediata.
* Consulta pseudo-síncrona: la operación no modifica el estado, pero sí necesita un resultado para que se pueda continuar con el flujo. Dado que no modifica el estado, si la respuesta no se recibió, entonces se puede volver a pedir.
* Modificación "disparar y olvidarse": la operación implica modificación en el estado de la aplicación, pero no requiere una respuesta. Este es el patrón en que se piensa de inmediato, y es el que mejor provecho obtiene del mecanismo de colas.
* Modificación asíncrona con notificación.
* Modificación pseudo-síncrona: sí se requiere una respuesta para poder continuar.
En definitiva, lo más común es que el mensaje enviado contenga un requerimiento de acción. Ese requerimiento tendrá un formato conocido por quien envía y quien responde.
En .NET, las clases que trabajan con MSMQ se encuentran en el ensamblado System.Messaging, y se ofrece un mecanismo de "deshidratación/rehidratación" de objetos para pasar dentro de los mensajes (propiedad Body de la clase Message), o bien un flujo para trabajar de manera manual (propiedad BodyStream).
El trabajo manual con la propiedad BodyStream no funciona bien en realidad, hay que decirlo. El problema es que cualquier acceso a la propiedad "Body" invoca el mecanismo de deshidratación (un objeto que implemente IMessageFormatter), y si uno pasa un mensaje por parámetro, la propiedad es consultada por alguna parte del sistema.
Con lo dicho, resulta más prolijo si bien más trabajoso, crear una clase propia que se encargue del formato, implementando IMessageFormatter.
En tu próximo sistema distribuido, multiusuario, superconcurrente: ¿qué vas a usar? Si querés que te ayude con ejemplos de código u otras direcciones, no dudes en ingresar un comentario.
Por: Ignacio Nicolás Rodríguez | Tecnología | Comentarios (1) | Referencias (0)
Comentarios
Hola muy buenas.
Soy Desarrollador .Net y nuevo en el Mundillo de las MQ ejje...Me pregunto si me podrias ayduar con un ligero desarrollo o decirme dnd documentarme.
Veras, hay una compañia que ofece un servicio web para recibir SMS, pues bien..Cuando lo recibe lanza un evento...Ami me gustaria que capturar ese evento cada vez que se dispara y mostrar una Alerta en mi Web...Y entiendo que necesito una cola si quiero notificar y realizar una accion cada vez que recibo un SMS no?
saludos y gracias
Joaquin | 08-06-2006 06:59:05
Comentar




