Pregunta

Nuestro cliente desea saber quién está en línea y actualmente está utilizando la aplicación personalizada que escribimos para ellos. Lo discutí con ellos y esto no tiene por qué ser exacto , más de un ambiente de invitados funcionará.

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

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

  2. Envíe un " solicitud de solicitud en línea " Desde nuestro software, en busca de respuestas, esto podría hacerse en un intervalo programado y luego sellar el registro de usuario con la fecha y hora actual para cada respuesta que recibí.

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

Clarificación

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

Por Windows me refiero a cliente-servidor.

Clarificación

Estoy usando una arquitectura de n niveles para que mis objetos de negocios 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, quizás 100 usuarios como máximo.

¿Fue útil?

Solución

Nuestra solución es mantener una " Transacción " tabla (que sigue lo que se hizo), además de nuestra " Sesión " Tabla (que sigue quien estuvo aquí). Todas las instrucciones de ACTUALIZACIÓN, INSERTAR y BORRAR se administran a través de una " Transacción " objeto y cada una de estas instrucciones SQL se almacena en la " Transacción " tabla una vez que se ha ejecutado con éxito en la base de datos (según las tablas actualizadas: tenemos la posibilidad de seguir específicamente algunas tablas e ignorar otras). Esta " Transacción " La tabla 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 pros para esta solución son:

  1. puedes decir " qué quién y cuándo " y mostrarlo a tus usuarios. (necesitarás algo de código para analizar las sentencias 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

Los 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% del volumen de su base de datos

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

Otros consejos

He visto trabajar la estrategia 1 antes. Por supuesto el sitio era pequeño.

Me pregunto cómo lo hace un sitio como stackoverflow.

Deben estar orientados a un evento específico, ya que solo hice una herramienta en el sitio, miré mi perfil y aún digo algo como visto por última vez hace 8 minutos .

Acabo de colocar una tabla de registro en la base de datos.

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

Puede colocar un nuevo registro en la tabla cuando alguien inicie o cierre la sesión o, alternativamente, actualice el último registro para el usuario.

Si tienes datos de sesión solo usa eso. La mayoría de los sistemas de sesión ya tienen marcas de tiempo, por lo que pueden caducar las sesiones que no se utilizan durante x minutos.

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

Por otra parte, si desea monitorearlo con el tiempo, creo que el inicio y el final de la sesión de registro en la base de datos es la mejor opción, y calcula la actividad del usuario después del hecho con una consulta simple.

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

Si cada usuario significativo recibe una sesión, puede escribir su propia implementación SessionListener para realizar un seguimiento de cada sesión que se haya creado y destruido.

[DESCARGO DE RESPONSABILIDAD 2 --- Código no probado ni 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 registra esto en tu web.xml:

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

Espero que esto ayude.

El único problema con una solución de aplicación web es que a menudo no se sabe cuándo 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 llega a la base de datos. Pero tendrá que aceptar que habrá una forma confiable de capturar cuando una persona cierre la sesión; muchos simplemente se alejarán del sitio sin tomar el " cierre de sesión " acción.

Me imagino que usar un activador sería una opción razonable que le impediría tener que meterse con cualquier diferencia lógica entre la web y el entorno no web (o cualquier otro entorno). Sin embargo, esto solo captura los cambios en el entorno y no hace nada cuando se hacen declaraciones seleccionadas. Sin embargo, esto puede superarse si todos los comandos de sus aplicaciones se ejecutan a través de procedimientos almacenados.

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 tal vez "autenticado en los últimos X minutos".

Elija un conjunto de eventos (solicitud realizada, actualización realizada, autenticado, ...) y regístrelos en una tabla de base de datos.

Regístrelos 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 exactamente de cuándo / cómo / qué estás intentando rastrear. Si necesita realizar un seguimiento de varias sesiones, normalmente veré a personas que usan un sistema de sesión vinculado a una cuenta de usuario, y luego, transcurrido un tiempo específico, esa sesión se considerará muerta.

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

Acabo de implementar un último sistema visto para mi sitio web. Tu primera opción es similar, pero solo actualizo cada + -5 minutos. Funciona para mi situación, pero los sitios web de mayor escala pueden requerir algo extra.

<?php
function updateLastSeen($user_ref, $session_id, $db) { /*Parameters: The user's primary key, the user's session id, the connection to the database*/
  $timestamp = date('Y-m-d H:i:s');
  if ($session_id !== '') {
    /*logged in*/
    $sql_check = "SELECT user_id FROM user_last_seen WHERE user_id = ?";
    $stmt_check = $db->prepare($sql_check);
    $stmt_check->bind_param('s', $user_ref);
    $result_check = $stmt_check->execute();
    $stmt_result_check = $stmt_check->get_result();
    if ($stmt_result_check->num_rows > 0) { /*If the user's last seen was previously recorded, update his record*/
      $sql = "UPDATE user_last_seen SET last_seen = ? WHERE user_id = ?"; 
    } else { /*Otherwise, insert a record for him*/
      $sql = "INSERT INTO user_last_seen (last_seen, user_id) VALUES (?,?)";
    }
    $stmt = $db->prepare($sql);
    $stmt->bind_param('ss', $timestamp, $user_ref);
    $result = $stmt->execute();
  }
}
if( !isset(

Acabo de implementar un último sistema visto para mi sitio web. Tu primera opción es similar, pero solo actualizo cada + -5 minutos. Funciona para mi situación, pero los sitios web de mayor escala pueden requerir algo extra.

<*>SESSION['lastSeen']) ){ /*User logs into the website or lands on the current page, create a lastSeen variable*/

Acabo de implementar un último sistema visto para mi sitio web. Tu primera opción es similar, pero solo actualizo cada + -5 minutos. Funciona para mi situación, pero los sitios web de mayor escala pueden requerir algo extra.

<*>SESSION['lastSeen'] = time(); updateLastSeen($user_ref, $session_id, $db); } else { $last_seen_time_difference = (time() -

Acabo de implementar un último sistema visto para mi sitio web. Tu primera opción es similar, pero solo actualizo cada + -5 minutos. Funciona para mi situación, pero los sitios web de mayor escala pueden requerir algo extra.

<*>SESSION['lastSeen']) / 60; if ($last_seen_time_difference > 5) { //if the difference between now and the lastSeen is 5 minutes or more, record his last seen. updateLastSeen($user_ref, $session_id, $db);

Acabo de implementar un último sistema visto para mi sitio web. Tu primera opción es similar, pero solo actualizo cada + -5 minutos. Funciona para mi situación, pero los sitios web de mayor escala pueden requerir algo extra.

<*>SESSION['lastSeen'] = time(); /*after updating the database, reset the lastSeen time to now.*/ }/* else { //do nothing. Don't update database if lastSeen is less than 5 minutes ago. This prevents unnecessary database hits. }*/ }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top