tier solarwinds rastreo rastrear rastreador programming programa pattern para multilayer layers internet informaticos informacion dpa datos data cookie business application database database-design user-input n-tier

database - rastreo - solarwinds oracle monitoring



Estrategia para rastrear la actividad reciente del usuario (11)

El único problema con una solución de aplicación web es que a menudo no sabes cuando alguien cierra la sesión. Obviamente, si tiene un requisito de inicio de sesión / autenticación, puede capturar cuando una persona inicia sesión y, como parte de su código de acceso a datos, puede iniciar sesión cuando una persona acceda a la base de datos. Pero tendrá que aceptar que habrá una manera confiable de capturar cuando una persona cierre sesión; muchos simplemente se alejarán del sitio sin tomar la acción de "cerrar sesión".

A nuestro cliente le gustaría saber quién está en línea y actualmente está usando la aplicación personalizada que escribimos para ellos. Lo discutí con ellos y no es necesario que sea exacto , más de un huésped funcionará.

Entonces mi pensamiento es un intervalo de 15 minutos para determinar la actividad del usuario. Algunas ideas que tengo para hacer esto son las siguientes:

  1. Selle su registro de usuario con una fecha y hora de su última actividad cada vez que hagan algo que llegue a la base de datos, o solicite una página web ... aunque esto podría requerir bastante de la base de datos.

  2. Envíe un "quién es la solicitud en línea" de nuestro software, buscando respuestas, esto se puede hacer en un intervalo programado, y luego estampar el registro del usuario con la fecha y hora actuales de cada respuesta que recibí.

¿Cuáles son tus pensamientos? ¿Y cómo manejarías esta situación?

Aclaración

Me gustaría usar la misma arquitectura para Windows o la Web si es posible. Tengo una única capa de lógica de negocios con la que interactúan múltiples interfaces de usuario, podría ser Windows o la Web.

Por Windows quiero decir cliente-servidor.

Aclaración

Estoy usando una arquitectura de n niveles para que mis objetos comerciales manejen toda la interacción con la capa de presentación. Esa capa de presentación podría estar alimentando una aplicación de Windows cliente-servidor, una aplicación web, un servicio web, etc.

No es una aplicación de alto tráfico, ya que fue desarrollada para un cliente nuestro, tal vez 100 usuarios como máximo.


He visto que la estrategia 1 funciona antes. Por supuesto, el sitio era pequeño.


Me imagino que usar un disparador sería una opción razonable que te impediría tener que lidiar con las diferencias lógicas entre la web y el entorno no web (o cualquier otro entorno para el caso). Sin embargo, esto solo captura los cambios en el entorno y no hace nada cuando se hacen declaraciones select. Sin embargo, esto puede superarse si todos los comandos de las aplicaciones se ejecutan a través de procedimientos almacenados.


Me pregunto cómo lo hace un sitio como .

Deben apuntar a un evento específico, ya que acabo de trabajar en el sitio, echar un vistazo a mi perfil, y todavía dice algo como lo que vi hace 8 minutos .


Nuestra solución es mantener una tabla de "Transacción" (que sigue lo que se hizo), además de nuestra tabla de "Sesión" (que sigue quién estuvo aquí). Las instrucciones UPDATE, INSERT y DELETE se administran mediante un objeto "Transaction" y cada una de estas instrucciones SQL se almacena en la tabla "Transaction" una vez que se ha ejecutado correctamente en la base de datos (dependiendo de las tablas actualizadas: tenemos la posibilidad de sigue algunas tablas e ignora otras). Esta tabla "Transaction" tiene otros campos como transactiontType (I para INSERT, D para DELETE, U para UPDATE), transactionDateTime, etc., y una clave externa "sessionId", que nos dice finalmente quién envió la instrucción. Incluso es posible, a través de algún código, identificar quién hizo qué y cuándo (Gus creó el registro el lunes, Tim cambió el Precio unitario el martes, Liz agregó un descuento adicional el jueves, etc.).

Los profesionales para esta solución son:

  1. ¡puede decir "qué y cuándo" y mostrarlo a sus usuarios! (Necesitará un código para analizar las declaraciones de SQL)
  2. si sus datos se replican y la replicación falla, puede reconstruir su base de datos a través de esta tabla

Contras son

  1. 100 000 actualizaciones de datos por mes significan 100 000 registros en Tbl_Transaction
  2. Finalmente, esta tabla tiende a ser el 99% de su volumen de base de datos

Nuestra elección: todos los registros anteriores a 90 días se eliminan automáticamente cada mañana


Puede incrementar una variable global cada vez que se crea una sesión de usuario y disminuirla cuando se destruye. De esta forma siempre sabrá cuántos usuarios están conectados en un momento dado.

Si desea monitorearlo a lo largo del tiempo, por otro lado, creo que iniciar y finalizar sesión de registro en la base de datos es la mejor opción, y usted calcula la actividad del usuario después del hecho con una simple consulta.


Si tiene datos de sesión solo use eso. La mayoría de los sistemas de sesión ya tienen marcas de tiempo para que puedan caducar las sesiones que no se utilizan durante x minutos.


Solo dejaría caer una tabla de registro en el db.

UserId int FK
Action char (3) (''in'' o ''out'')
Hora DateTime

Puede colocar un nuevo registro en la tabla cuando alguien inicia o cierra sesión o, alternativamente, actualiza el último registro para el usuario.


[RENUNCIA DE RESPONSABILIDAD 1 --- Solución Java]

Si a cada usuario significativo se le asigna una sesión, entonces podría escribir su propia implementación de SessionListener para rastrear cada sesión que se haya creado y destruido.

[NEGACIÓN DE RESPONSABILIDAD 2 --- Código no probado o compilado]

public class ActiveSessionsListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent e) { ServletContext ctx = e.getSession().getServletContext(); synchronized (ctx) { Integer count = ctx.getAttribute("SESSION_COUNT"); if (count == null) { count = new Integer(0); } ctx.setAttribute("SESSION_COUNT", new Integer(count.intValue() + 1); } } public void sessionDestroyed(HttpSessionEvent e) { ... similar for decrement ... } }

Y registre esto en su web.xml:

<listener-class>com.acme.ActiveSessionsListener</listener-class>

Espero que esto ayude.


Con una aplicación web, el concepto de "en línea" es un poco nebuloso. Lo mejor que puede hacer es "hacer una solicitud en los últimos X minutos" o quizás "autenticarse en los últimos X minutos".

Elija un conjunto de eventos (solicitud realizada, actualización realizada, autenticado, ...) y conéctelos a una tabla de BD.

Regístrese en una tabla en una base de datos separada


He trabajado con muchos sistemas que han utilizado el primer método que enumeró, con un poco de planificación cuidadosa se puede hacer de una manera que realmente no tenga mucho efecto.

Todo depende de exactamente cuándo / cómo / qué estás tratando de rastrear. Si necesita realizar un seguimiento de varias sesiones, generalmente veré personas que usan un sistema de sesión vinculado a una cuenta de usuario y luego, en un tiempo específico transcurrido, la sesión se considerará muerta.

Si realmente está buscando actualmente en línea, su primera opción es la mejor.