De polling a eventos

06/09/2007 - 13:12 por Lars | Informe spam
Hola a todos,

Tengo un WS que inserta datos en una base de datos. Es un sistema de
facturas con detalles de factura. Cuando el detalle de la factura se ha
completado debe ser procesado por un servicio (o varios en varias maquinas).
Una opción es que los servicios hagan pooling a la base de datos. Aqui tengo
una duda, ¿como puedo hacer para que en lugar de que el servicio haga
pooling montar un sistema de eventos? Teniendo en cuenta que el servicio
corre en varia maquinas.

Un saludete.
 

Leer las respuestas

#1 Alberto Poblacion
06/09/2007 - 17:36 | Informe spam
"Lars" wrote in message
news:
Tengo un WS que inserta datos en una base de datos. Es un sistema de
facturas con detalles de factura. Cuando el detalle de la factura se ha
completado debe ser procesado por un servicio (o varios en varias
maquinas). Una opción es que los servicios hagan pooling a la base de
datos. Aqui tengo una duda, ¿como puedo hacer para que en lugar de que el
servicio haga pooling montar un sistema de eventos? Teniendo en cuenta que
el servicio corre en varia maquinas.



Primera cuestión: ¿Es necesario que el evento lo dispare la base de
datos? Lo digo porque si el evento en cuestión corresponde con la inserción
de determinados datos, y los datos siempre los inserta un servicio web,
entonces el servicio web sabe cuándo hay que disparar el evento, y no es
necesario delegarlo a la base de datos. Esto puede simplificar las cosas ya
que el servicio web está formado por código .Net que suele ser más fácil de
manipular que el código de base de datos.
Si no fuera asi, es decir, si los datos pueden entrar en la base de
datos por distintas vías (no solo el servicio web), entonces sí que será
necesario que el evento lo dispare la base de datos. Esto se puede hacer de
dos formas: O bien todas las grabaciones se hacen por medio de un
procedimiento almacenado, en cuyo caso el procedimiento puede disparar el
evento después de grabar, o bien se añade un Trigger a la tabla o tablas
necesarias y es el trigger el que dispara el evento.
El problema en este caso es el cómo inicio una comunicación desde el
código de la base de datos contra el servidor o servidores que deben
procesar el evento. Asumiendo que sea Sql Server, si es la versión 2005 se
puede añadir un procedimiento o trigger escrito en .Net y que este inicie la
comunicación. Si es un 2000, habría que tirar de xp_cmdshell, lo cual es
lento y es delicado en cuanto a seguridad, o usar un objeto COM, o escribir
un procedimiento extendido en C++. Todo ello más complicado que la
alternativa de usar C# (teniendo en cuenta que la pregunta ha sido hecha en
un foro de C#).

Segunda cuestión: Quieres los eventos fuertemente acoplados o débilmente
acoplados.
Los fuertemente acoplados son aquellos en los que los clientes se
registran en el servidor, y el servidor conoce a los clientes (entendiendo
por "clientes" los suscriptores del evento, es decir los servicios que han
de recibirlo). El servidor "llama" a cada uno de los clientes cuando dispara
el evento, y se produce un error si el cliente no está disponible. En este
caso, la comunicación del servidor a los clientes podría hacerse por .Net
Remoting, o por colas de mensajes. Las dos cosas son sencillas de programar
en .Net.
Los eventos débilmente acoplados pasan por un servicio intermedio que
"registra" las suscripciones. El servidor publica un evento, y cuando lo
dispara solo tiene que enviarlo una vez y es ese servicio intermedio el que
lo "repite" hacia los clientes que estén en ese momento disponibles, sin que
el servidor tenga que preocuparse de saber cuáles son o de repartirles los
eventos. En el mundo Windows esto se hace mediante los Eventos Debilmente
Acoplados de COM+ (Servicios de Componentes). Desde .Net se pueden programar
por medio de System.EnterpriseServices, pero aviso que es bastante complejo.

Preguntas similares