Strategie zum Verfolgen der letzten Aktivität des Benutzers

8

Unser Kunde möchte wissen, wer online ist und derzeit die benutzerdefinierte Anwendung nutzt, die wir für ihn geschrieben haben. Ich habe es mit ihnen besprochen und das muss nicht genau sein, mehr von einem guatemate wird funktionieren.

Mein Gedanke ist also ein 15-minütiges Zeitintervall, um die Benutzeraktivität zu bestimmen. Einige Ideen, die ich dafür habe, sind wie folgt:

  1. Stempeln Sie ihren Benutzerdatensatz mit Datum und Uhrzeit ihrer letzten Aktivität jedes Mal, wenn sie etwas tun, das die Datenbank trifft oder eine Webseite anfordert ... dies könnte jedoch ziemlich datenbankintensiv sein.

  2. Senden Sie eine "wer ist Online-Anfrage" von unserer Software, suchen Sie nach Antworten, dies könnte in einem geplanten Intervall erfolgen, und stemple dann den Benutzerdatensatz mit dem aktuellen Datum und der Uhrzeit für jede Antwort, die ich erhielt.

Was sind deine Gedanken? Und wie würdest du mit dieser Situation umgehen?

Erläuterung

Ich würde gerne die gleiche Architektur für Windows oder das Web verwenden, wenn möglich. Ich habe eine einzelne Geschäftslogikebene, mit der mehrere Benutzeroberflächen interagieren, beispielsweise Windows oder das Web.

Unter Windows würde ich Client-Server meinen.

Erläuterung

Ich verwende eine n-Tier-Architektur, so dass meine Geschäftsobjekte alle Interaktionen mit der Präsentationsschicht handhaben. Diese Präsentationsschicht könnte eine Client-Server-Windows-Anwendung, eine Webanwendung, einen Webdienst usw. versorgen.

Es ist keine Anwendung mit hohem Datenverkehr, wie sie für einen unserer Kunden entwickelt wurde, höchstens 100 Benutzer.

    
mattruma 06.10.2008, 13:19
quelle

11 Antworten

3

Unsere Lösung besteht darin, zusätzlich zu unserer Tabelle "Sitzung" (die folgt, wer hier war) eine "Transaktionstabelle" zu führen (die folgt, was getan wurde). UPDATE-, INSERT- und DELETE-Anweisungen werden alle über ein "Transaction" -Objekt verwaltet und jede dieser SQL-Anweisungen wird in der "Transaction" -Tabelle gespeichert, sobald sie erfolgreich in der Datenbank ausgeführt wurde (abhängig von aktualisierten Tabellen) folgen Sie einigen Tabellen und ignorieren Sie andere). Diese "Transaction" -Tabelle hat andere Felder wie transactiontType (I für INSERT, D für DELETE, U für UPDATE), transactionDateTime usw. und einen Fremdschlüssel "sessionId", der uns schließlich sagt, wer den Befehl gesendet hat. Es ist sogar möglich, anhand eines Codes herauszufinden, wer wann was gemacht hat (Gus hat den Datensatz am Montag erstellt, Tim hat am Dienstag den Stückpreis geändert, Liz hat am Donnerstag einen zusätzlichen Rabatt hinzugefügt).

Vorteile für diese Lösung sind:

  1. Sie können "what who and when" sagen und es Ihren Benutzern zeigen! (Sie benötigen etwas Code, um SQL-Anweisungen zu analysieren)
  2. Wenn Ihre Daten repliziert werden und die Replikation fehlschlägt, können Sie Ihre Datenbank über diese Tabelle neu erstellen

Nachteile sind

  1. 100 000 Datenaktualisierungen pro Monat bedeuten 100 000 Datensätze in Tbl_Transaction
  2. Schließlich ist diese Tabelle in der Regel 99% Ihres Datenbankvolumens

Unsere Wahl: Alle Datensätze, die älter als 90 Tage sind, werden jeden Morgen automatisch gelöscht

    
Philippe Grondier 06.10.2008, 18:11
quelle
1

Ich habe schon gesehen, dass Strategie 1 funktioniert. Natürlich war die Seite eine kleine.

    
epochwolf 06.10.2008 13:22
quelle
0

Ich würde einfach eine Log-Record-Tabelle in der Datenbank löschen.

UserId int FK
Aktionszeichen (3) ('in' oder 'out')
Uhrzeit DateTime

Sie können einen neuen Datensatz in die Tabelle einfügen, wenn sich jemand an- oder abmeldet oder alternativ den letzten Datensatz für den Benutzer aktualisiert.

    
Will 06.10.2008 13:23
quelle
0

Wenn Sie Sitzungsdaten haben, verwenden Sie diese. Die meisten Sitzungssysteme haben bereits Zeitstempel, so dass sie Sitzungen ablaufen lassen können, die für x Minuten nicht verwendet werden.

    
MattW. 06.10.2008 13:24
quelle
0

Sie können eine globale Variable jedes Mal inkrementieren, wenn eine Benutzersitzung erstellt wird, und sie dekrementieren, wenn sie zerstört wird. Auf diese Weise wissen Sie, immer wie viele Benutzer zu einem bestimmten Zeitpunkt online sind.

Wenn Sie es im Laufe der Zeit überwachen möchten, denke ich andererseits, dass das Starten und Beenden der Protokollierungssitzung für die Datenbank die beste Option ist, und Sie berechnen die Benutzeraktivität nachträglich mit einer einfachen Abfrage.

    
schonarth 06.10.2008 13:30
quelle
0

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

Wenn jedem sinnvollen Benutzer eine Sitzung gegeben wird, könnten Sie Ihre eigene SessionListener-Implementierung schreiben, um jede Sitzung zu verfolgen, die erstellt und zerstört wurde.

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

%Vor%

Und registrieren Sie dies in Ihrer web.xml:

%Vor%

Hoffe, das hilft.

    
toolkit 06.10.2008 13:35
quelle
0

Das einzige Problem mit einer Webanwendungslösung ist, dass Sie oft nicht wissen, wann jemand abmeldet. Wenn Sie eine Anmelde- / Authentifizierungsanforderung haben, können Sie natürlich erfassen, wann sich eine Person anmeldet, und als Teil Ihres Datenzugriffscodes können Sie protokollieren, wenn eine Person die Datenbank antrifft. Aber Sie müssen akzeptieren, dass es eine zuverlässige Art der Erfassung geben wird, wenn sich eine Person abmeldet - viele werden sich einfach von der Site entfernen, ohne die "Abmeldung" -Aktion zu machen.

    
Ken Ray 06.10.2008 13:45
quelle
0

Ich würde mir vorstellen, dass die Verwendung eines Triggers eine vernünftige Option wäre, die verhindern würde, dass Sie sich mit irgendwelchen logischen Unterschieden zwischen der Web- und der Nicht-Web-Umgebung (oder irgendeiner anderen Umgebung) herumschlagen müssen. Dies erfasst jedoch nur Änderungen an der Umgebung und bewirkt nichts, wenn ausgewählte Anweisungen erstellt werden. Dies kann jedoch überwunden werden, wenn alle Ihre Befehle von Ihren Apps über gespeicherte Prozeduren ausgeführt werden.

    
Dan Coates 06.10.2008 13:48
quelle
0

Ich frage mich, wie eine Site wie stackoverflow das macht?

Sie müssen auf ein bestimmtes Ereignis abzielen, da ich gerade um die Website herum gearbeitet habe, einen Blick auf mein Profil geworfen habe und immer noch so etwas wie zuletzt gesehen vor 8 Minuten gesagt habe.

    
mattruma 06.10.2008 15:43
quelle
0

Mit einer Web-App ist das Konzept von "online" ein wenig nebulös. Das Beste, was Sie wirklich tun können, ist "eine Anfrage in den letzten X Minuten" oder vielleicht "in den letzten X Minuten authentifiziert".

Wählen Sie eine Reihe von Ereignissen aus (Anforderung ausführen, Aktualisierung ausführen, authentifiziert usw.) und protokollieren Sie sie in einer DB-Tabelle.

Protokollieren Sie sie in einer separaten Datenbank in einer Tabelle

    
AJ. 07.10.2008 14:30
quelle
0

Ich habe mit vielen Systemen gearbeitet, die die erste Methode verwendet haben, die Sie aufgelistet haben, mit ein wenig sorgfältiger Planung kann es auf eine Weise gemacht werden, die wirklich keine große Wirkung hat.

Es hängt alles davon ab, wann / wie / was Sie zu verfolgen versuchen. Wenn Sie mehrere Sitzungen verfolgen müssen, sehe ich normalerweise Personen, die ein mit einem Benutzerkonto verknüpftes Sitzungssystem verwenden, und dann eine bestimmte verstrichene Zeit, für die diese Sitzung als tot gilt.

Wenn Sie wirklich online suchen, ist Ihre erste Option die beste.

    
Mitchel Sellers 06.10.2008 13:24
quelle