Frage

Unser Kunde möchte wissen, die online ist und zur Zeit mit der benutzerdefinierten Anwendung, die wir für sie geschrieben hat. Ich sprach mit ihnen und dies muss nicht sein genau , eher ein guestimate arbeiten.

Also mein Gedanke ist ein 15-minütige Zeitintervall Benutzeraktivität zu bestimmen. Einige Ideen, die ich habe, dies zu tun, sind wie folgt:

  1. ihren Benutzerdatensatz mit einem Datum und Uhrzeit ihrer letzten Tätigkeit Rotten jedes Mal, wenn sie etwas tun, das die Datenbank trifft, oder eine Internetseite ... dies obwohl könnte durchaus Datenbank intensiv sein.

  2. Senden Sie ein unsere Software „die Online-Anfrage ist“, für Antworten suchen, diese zu einem geplanten Intervall durchgeführt werden konnten, und dann mit dem aktuellen Datum und Uhrzeit für jede Antwort, die ich erhielt den Benutzerdatensatz stempeln.

Was sind Ihre Gedanken? Und wie würden Sie mit dieser Situation umgehen?

Klarstellung

Ich mag die gleiche Architektur, wenn möglich, für Windows oder im Web verwenden. Ich habe eine einzige Business-Logik-Schicht, die mehr Benutzerschnittstellen mit interagieren, könnte Windows bzw. das Web sein.

Mit dem Windows-würde ich mein Client-Server.

Klarstellung

Ich verwende eine n-Tier-Architektur so meine Business-Objekte mit der Darstellungsschicht des ganzen Interaktion behandeln. Das Präsentationsschicht kann eine Client-Server-Windows-Anwendung, Web-Anwendung, Web-Service und so weiter füttern.

Es ist nicht eine hohe Verkehr Anwendung, da es für einen Kunden von uns, vielleicht 100 Benutzern höchstens entwickelt wurde.

War es hilfreich?

Lösung

Unsere Lösung ist eine „Transaktion“ Tabelle zu halten (was folgt, was getan wurde), zusätzlich zu unserer „Session“ Tabelle (was folgt, der hier war). UPDATE, INSERT und DELETE Anweisungen werden alle durch eine „Transaktion“ Objekt verwaltet und jede dieser SQL-Anweisung wird in der „Transaktion“ Tabelle gespeichert, sobald sie auf der Datenbank erfolgreich ausgeführt wurde (abhängig von Tabellen aktualisiert: wir haben die Möglichkeit, speziell auf folgen einige Tabellen und ignorieren andere). Diese „Transaktion“ Tabelle hat andere Felder wie transactiontType (I für INSERT, D für DELETE, U für UPDATE), transactionDateTime, usw. und einem Fremdschlüssel „sessionId“, sagt uns schließlich, die die Anweisung gesendet. Es ist sogar möglich, durch einige Codes, zu ermitteln, wer wann was getan hat (Gus den Rekord am Montag erstellt, Tim den Einheitspreis am Dienstag geändert, Liz einen zusätzlichen Rabatt hinzugefügt am Donnerstag, etc).

Pros für diese Lösung sind:

  1. sind Sie in der Lage, „was, wer und wann“ zu sagen, und es Ihre Benutzer zu zeigen! (Sie werden einige Code müssen SQL-Anweisungen analysieren)
  2. , wenn Ihre Daten repliziert ist, und die Replikation fehlschlägt, können Sie Ihre Datenbank durch diese Tabelle
  3. Wiederaufbau

Cons sind

  1. 100 000 Daten-Updates pro Monat bedeuten 100 000 Datensätze in Tbl_Transaction
  2. Schließlich neigt diese Tabelle 99% Ihres Datenbank-Volume sein

Unsere Auswahl: alle Datensätze älter als 90 Tage jeden Morgen automatisch gelöscht werden

Andere Tipps

Ich habe vor Strategie 1 der Arbeit gesehen. Natürlich war der Ort ein kleiner.

Ich frage mich, wie eine Website wie Stackoverflow es tut?

Sie müssen ein bestimmtes Ereignis ausrichten, wie ich rund um die Seite gerade bearbeitet, einen Blick auf meinem Profil nehmen, und sagen immer noch so etwas wie zum letzten Mal vor 8 Minuten gesehen .

Ich würde nur eine Protokolldatensatz-Tabelle in der db fallen.

UserId int FK
Action-char (3) ( 'in' oder 'out')
Zeit Datetime

Sie können einen neuen Datensatz in der Tabelle fallen, wenn jemand anmeldet oder aus oder alternativ den letzten Datensatz für den Benutzer aktualisieren.

Wenn Sie die Sitzungsdaten haben nur diese verwenden. Die meisten Session Systeme bereits Zeitstempel haben, so dass sie Sitzungen verwendet wird, nicht für x Minuten ablaufen kann.

Sie können eine globale Variable erhöht jedes Mal eine Benutzersitzung erstellt wird, oder vermindern, wenn es zerstört wird. Auf diese Weise werden Sie immer wissen, wie viele Benutzer sind online zu einem bestimmten Zeitpunkt.

Wenn Sie wollen, dass es im Laufe der Zeit zu überwachen, auf der anderen Seite, ich glaube, Sitzungsbeginn anmelden und in die Datenbank beenden ist die beste Option, und Sie die Benutzeraktivität nach der Tat mit einer einfachen Abfrage berechnen.

[HAFTUNGSAUSSCHLUSS 1 --- Java-Lösung]

Wenn jeder sinnvolle Benutzer eine Sitzung gegeben wird, dann könnten Sie Ihre eigene SessionListener Implementierung schreiben jede Sitzung zu verfolgen, die erstellt und zerstört wurde.

[HAFTUNGSAUSSCHLUSS 2 ----Code nicht getestet oder kompiliert]

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 ...    
    }
}

Und registrieren Sie dies in Ihrem web.xml:

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

Hope, das hilft.

Das einzige Problem mit einer Web-Anwendung Lösung ist, dass Sie wissen oft nicht, wenn sich jemand aus. Natürlich, wenn Sie ein Login / Authentifizierung Anforderung haben, können Sie erfassen, wenn eine Person Zeichen auf, und als Teil Ihrer Datenzugriffscode, können Sie sich anmelden, wenn eine Person die Datenbank trifft. Aber Sie werden akzeptieren müssen, dass es auf zuverlässige Art und Weise wird der Erfassung, wenn eine Person sich abmeldet -. Viele werden nur von der Seite wegbewegen, ohne den „abmelden“ Maßnahmen zu ergreifen

Ich könnte mir vorstellen, dass ein Trigger eine vernünftige Option wäre, dass Sie davon ab, zu Chaos mit irgendwelchen logischen Unterschieden zwischen der Bahn und der Nicht-Web-Umgebung (oder einer anderen Umgebung, was das betrifft) ausschließen würde. dies jedoch nur erfasst Änderungen an der Umwelt und tut nichts, wenn das Auswahl Aussagen gemacht werden. Dies kann jedoch überwunden werden, wenn alle Befehle aus Ihrer Apps über gespeicherte Prozeduren ausgeführt werden.

Mit einem Web-App, das Konzept der „online“ ist ein wenig nebulös. Das Beste, was Sie wirklich tun, ist „einen Antrag in den letzten X Minuten“ oder vielleicht „in den letzten X Minuten authentifiziert“.

Wählen Sie eine Reihe von Ereignissen (hergestellt Anforderung, ausgeführt Update, authentifiziert, ...), und melden sie an eine DB-Tabelle.

Melden Sie sie an einen Tisch in einer separaten DB

Ich habe mit vielen Systemen gearbeitet, die die erste Methode verwendet haben Sie mit einer wenig sorgfältigen Planung aufgeführt ist, können sie in einer Art und Weise durchgeführt werden, die wirklich nicht viel von einer Wirkung haben.

Es hängt alles von genau wann / wie / was Sie verfolgen möchten. Wenn Sie mehrere Sitzungen zu verfolgen brauchen werde ich in der Regel der Menschen sieht, die eine Sitzung System zu einem Benutzerkonto gebunden verwenden, und dann durch eine spezifische verstrichene Zeit ist, dass Sitzung consiered tot.

Wenn Sie wirklich für die gerade online suchen sind, Ihre erste Option ist die beste.

Ich habe implementiert nur ein letztes gesehen System für meine Website. Ihre erste Option ist ähnlich, aber ich nur alle + -5 Minuten aktualisieren. Es funktioniert für meine Situation, aber in größerem Maßstab Websites könnte etwas ein wenig mehr benötigen.

<?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($_SESSION['lastSeen']) ){ /*User logs into the website or lands on the current page, create a lastSeen variable*/
  $_SESSION['lastSeen'] = time();
  updateLastSeen($user_ref, $session_id, $db);
} else {
  $last_seen_time_difference = (time() - $_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);   
    $_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.
  }*/
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top