3.30.2011

Utilizando WCF y MSMQ

Una de las características más relevantes y más sub utilizadas de WCF es su capacidad de interactuar con el servidor de colas de Windows – MSMQ. Existen muchas aplicaciones que están desarrolladas bajo un esquema sincrónico cuando en realidad no es necesario estrictamente hablando el utilizarlo. Esto se da en casos en donde por ejemplo se puede procesar algún mensaje y el cliente no necesita una confirmación de la operación ya que si el mensaje pudo ponerse en la cola, se puede tener plena seguridad que más temprano que tarde este será procesado.

Algunos ejemplos en donde se puede aplicar este tipo de operaciones son

  • Procesamiento de Órdenes – Ejemplo: Amazon.
  • Auditoría de Sistemas – Ejemplo: Guardar rastros de la ejecución de operaciones
  • Registro de Actividades – Recibir solicitudes cuyo procesamiento puede ser desde inmediato hasta tardar días o meses.

WCF y MSMQ

WCF se puede integrar con el servidor de colas de Microsoft de una manera muy sencilla, simplemente creando un endpoint extra al servicio y especificando en el mismo la dirección de la cola que queremos utilizar. Además, cuando un cliente invoca un servicio a través de un endpoint de msmq, en realidad no se esta comunicando con el servicio en sí, si no que esta poniendo un mensaje en la cola especificada por el endpoint generado del lado del cliente; del lado del servicio, existe un “listener” que escucha en la cola si hay mensajes para consumir por parte del servicio. Este esquema nos permite tener alta disponibilidad en nuestra aplicación, porque si el servicio no esta disponible, los mensajes siempre van a ser puestos en la cola y cuando el servicio vuelva a estar disponibles, estos son consumidos por WCF.

image

Por otro lado, las operaciones de WCF utilizando MSMQ son operaciones de una sola vía, por lo tanto no se reciben respuestas ni excepciones provocadas por el servicio.

Instalando Msmq

Para poder crear colas e integrarlas con WCF, tenemos que tener instalado el servidor de colas del sistema operativo; esto se logra desde agregar programas y habilitar funcionalidades de Windows.

image

Una vez instalado el servidor de colas de Windows procedemos a ir a crear nuestra cola de procesamiento en el mismo. Para esto, vamos a darle botón derecho sobre la opción equipo en el menú inicio y luego procedemos a seleccionar administrar. Luego nos aparece la pantalla de administración del equipo donde seleccionamos Message Queue Server.

image

Ahora vamos a proceder a crear la cola. En msmq existen dos tipos de colas: públicas y privadas. Las colas públicas son las que pueden accederse desde otros equipos, las colas privadas son las que están construidas para consumo local. En nuestro caso vamos a utilizar una cola privada, ya que para publicar una cola pública se requieren varias cosas extras como un controlador de dominio de colas y especificar el esquema de seguridad de la misma. Para crear una cola privada le damos botón derecho sobra el folder de colas privadas y en la pantalla de agregar cola digitamos el nombre de la cola y la ponemos transaccional; el nombre de la cola será requestqueue.

image

Una vez creada la cola esta debe de aparecer en el servidor como disponible.

image

Como podemos ver en la figura anterior, podemos acceder nuestra cola privada en la dirección private$\requestqueue.

Creando el Servicio

El siguiente paso es crear el servicio en WCF. Para esto simplemente vamos a crear un contrato con una operación, al ser las pilas asincrónicas y de una vía debemos definir estas operaciones como de una vía en el contrato, caso contrario vamos a tener un error del tipo InvalidOperationException a la hora de levantar el servicio.

[ServiceContract]
public interface IProcesarRegistros
{
[OperationContract(IsOneWay = true)]
void ProcesarRegistro(int id);

}

El siguiente paso es la implementación del servicio, el cual en este caso simplemente hará un trace del mensaje en la ventana de output de visual studio.

using System.Diagnostics;

namespace ColasPrueba
{
public class ProcesarRegistros : IProcesarRegistros
{
public void ProcesarRegistro(int id)
{
Trace.WriteLine( string.Format("Registro {0} Procesado", id.ToString()));
}
}
}


El siguiente paso es crear el endpoint para acceder a la cola creada anteriormente.

 <endpoint address="net.msmq://localhost/private/requestqueue"
binding="netMsmqBinding"
contract="ColasPrueba.IProcesarRegistros"
bindingConfiguration="msmqSinSeguridad" />

Como podemos ver, la dirección de la cola especifica que vamos a utilizar el protocolo msmq y que vamos a poner mensajes en una cola privada llamada requestqueue. Además agregamos un atributo llamado bindingConfiguration en donde vamos a especificar que la cola no tiene seguridad – las colas normalmente hay que asegurarlas, pero para este post vamos a usarla sin ningún tipo de control de acceso.

</services>
<
bindings>
<
netMsmqBinding>
<
binding name="msmqSinSeguridad">
<
security mode="None" />
</
binding>
</
netMsmqBinding>
</
bindings>
<
behaviors>

Con esto ya podemos ejecutar nuestro servicio para poder crear un cliente y hacer una referencia al mismo.


image


Creando el Cliente


Ahora procedemos a crear el cliente que va a consumir el servicio. En nuestro caso, vamos a consumir el metadata del servicio a a través del endpoint mex, que en nuestro caso utiliza la dirección base que es del tipo HTTP. El cliente para este ejemplo será una aplicación de consola y vamos a agregar la referencia al servicio de msmq copiando la dirección expuesta en el cliente de pruebas de WCF – pantalla anterior.


image


En el código creamos el proxy e invocamos el método ProcesarRegistro.

using ClienteColas.ReferenciaServicioColas;

namespace ClienteColas
{
class Program
{
static void Main(string[] args)
{
ReferenciaServicioColas.ProcesarRegistrosClient _proxy
= new ProcesarRegistrosClient("NetMsmqBinding_IProcesarRegistros");
_proxy.ProcesarRegistro(43);
Console.WriteLine("Mensaje Enviado");
}
}
}


Cuando ejecutamos la aplicación vemos que en la ventana de output se hace el trace del registro.


image


image


Por último, para probar la tolerancia a fallos de este esquema, vamos a apagar el servicio y vamos a ejecutar el cliente con el servicio detenido. Cuando esto sucede, el mensaje llega a la cola, pero esta no lo entrega porque no hay que este escuchando para consumirlo. El mensaje lo podemos ver almacenado en la cola.


image


Cuando levantamos de nuevo el servicio, el mensaje se procesa y desaparece de la cola.




Etiquetas de Technorati: ,

2 comentarios:

Anónimo dijo...

Excelente, muy puntual y claro. Gracias.

Preguntón Cojonero Cabrón dijo...

colas distribuidas ? activo - pasivo ?