Ayuda con arquitectura

18/05/2007 - 03:47 por Cesar Gazzo | Informe spam
Gente, tengo que hacer una aplicacion que es un Demonio que esta controlando
unos modems y una vez que recibe cierta información los graba en una DB.

Luego existen terminales con operadores que deben leer esa info que grabo el
Demonio.

Pregunta:
- De que forma podria hacer para que los clientes sepan que hay nuevos
registros en la db?

Una seria que cada N segundos hagan un Count(*) y si hay nuevos registros
los levanten.
Por otro lado estuve viendo algo de SystemMessaging y tambien gracias
ustedes algo de Log4Net.

Que recomiendan utilizar, seria un cliente y N > 10 estaciones terminales
que estarian las 24hs esperando esa información.

Desde ya muchas gracias y espero sus comentarios

César
 

Leer las respuestas

#1 Diego Jancic
18/05/2007 - 04:27 | Informe spam
Hola,
Lo que yo haria es guardar la fecha o un timespan o un "numero de
version" que se vaya actualizando cuando se cargue nueva informacion.
El cliente deberia saber que version mostro por ultima vez y
actualizar la informacion de acuerdo a las 2 versiones (la de la base
de datos y la ultima que el bajo).
Otra forma seria que cada registro con informacion tenga la fecha, y
cuando vos consultas simplemente haces un select * from info where
fecha >= @fecha_ultima_actualizacion de nuevo, la fecha de ultima
actualizacion la deberia guardar el cliente localmente para saber que
informacion tiene y cual no...
La 3er posibilidad que se me ocurre es usar los eventos de SqlServer
2005. Si bien es mucho mas simple, rapido y te evita tener que estar
preguntando cada 5 minutos, tenes el problema que te quedas "pegado"
al motor de base de datos.

Creo que las opciones estan ordenadas de forma tal que la primera es
la que aplica en mayor parte de casos y la ultima es la que mas
restricciones impone. La 2da puede ser una buena opcion, pero no se si
queres/podes agregar esa informacion en la base de datos...

Lo de los eventos de SQL Server 2005 no creo que haya problemas, pero
tendrias que tener en cuenta que no te va a convenir mucho si cada
terminal actualiza los datos 10 veces por segundo, por ejemplo...

Otra solucion que se me esta ocurriendo es manejar eventos en la
aplicacion del cliente que sean enviados (desde las terminales)
mediante Message Queue o algo similar, pero dudo que tenga sentido
algo asi en tu caso... Es simplemente una idea que puede servir para
generar un evento en el cliente y decirle "che! hay info nueva! :)"

Con respecto a lo del count(*), no me gusta demasiado... creo que va a
hacer las cosas dificiles de entender, pero no significa que no vaya a
funcionar, incluso es mas facil de hacerlo.. Pero fijate si en un
futuro no vas a hacer un update en vez de un insert, ya que esto
arruinaria las cosas... es por eso que no me gusta mucho, es
informacion parcial sobre si hay nueva informacion...
En caso de que sea una aplicacion de log solamente, te pueden pedir en
algun momento que dejes solo lo de los ultimos 2 años para disminuir
el tamaño, y en ese caso tambien se te va a romper la aplicacion del
cliente.
Se entiende porque no me gusta mucho el count(*) ??

Saludos!,
Diego

Preguntas similares