Ich entwerfe ein System, das große Anzahl von Benutzertransaktionen analysieren und aggregierte Kennzahlen (wie Trends und usw.) produzieren sollte. Das System sollte schnell arbeiten, robust und skalierbar sein. System ist Java-basiert (unter Linux).Echtzeit-Analyse-Prozess-System-Design
Die Daten stammen von einem System, das Protokolldateien (CSV-basiert) von Benutzertransaktionen generiert. Das System generiert jede Minute eine Datei und jede Datei enthält die Transaktionen verschiedener Benutzer (sortiert nach Zeit), jede Datei kann Tausende von Benutzern enthalten.
Eine beispielhafte Datenstruktur für eine CSV-Datei:
10: 30: 01, Benutzer 1, ...
10: 30: 01, Benutzer 1, ...
10.30.02 , Benutzer 78, ...
10: 30: 02, Benutzer 2, ...
10: 30: 03, Benutzer 1, ...
10: 30: 04, Benutzer 2, ...
. . .
Das System, das ich plane, sollte die Dateien verarbeiten und einige Analysen in Echtzeit durchführen. Er muss die Eingabe sammeln, sie an mehrere Algorithmen und andere Systeme senden und die berechneten Ergebnisse in einer Datenbank speichern. Die Datenbank enthält nicht die tatsächlichen Eingabedatensätze, sondern nur eine aggregierte Analyse auf hoher Ebene über die Transaktionen. Zum Beispiel Trends und etc.
Der erste Algorithmus, den ich verwenden möchte, erfordert für den besten Betrieb mindestens 10 Benutzerdatensätze, wenn er nach 5 Minuten keine 10 Datensätze finden kann, sollte er die verfügbaren Daten verwenden.
Ich würde gerne Storm für die Implementierung verwenden, aber ich würde es vorziehen, diese Diskussion in der Design-Ebene so viel wie möglich zu verlassen.
Eine Liste von Systemkomponenten:
Eine Aufgabe, die jede Minute eingehende Dateien überwacht.
Eine Aufgabe, die die Datei liest, analysiert und für andere Systemkomponenten und Algorithmen verfügbar macht.
Eine Komponente zum Puffern von 10 Datensätzen für einen Benutzer (nicht länger als 5 Minuten), wenn 10 Datensätze gesammelt wurden oder 5 Minuten vergangen sind, ist es Zeit, die Daten zur weiteren Verarbeitung an den Algorithmus zu senden. Da die Anforderung ist, mindestens 10 Datensätze für den Algorithmus zu liefern, dachte ich über Storm Field Grouping (was bedeutet, dass die gleiche Aufgabe für den gleichen Benutzer aufgerufen wird) und verfolgen die Sammlung von 10 Benutzerdatensätzen innerhalb der Aufgabe, natürlich ich Planen Sie mehrere dieser Aufgaben, jeder behandelt einen Teil der Benutzer.
Es gibt andere Komponenten, die an einer einzigen Transaktion arbeiten, für die ich andere Aufgaben erstellen möchte, die jede Transaktion erhalten, während sie geparst wird (parallel zu anderen Aufgaben).
Ich brauche Ihre Hilfe mit # 3.
Was ist die beste Vorgehensweise für den Entwurf einer solchen Komponente? Es ist offensichtlich, dass es die Daten für 10 Datensätze pro Benutzer pflegen muss. Eine Schlüsselwertzuordnung kann hilfreich sein. Ist es besser, die Zuordnung in der Aufgabe selbst zu verwalten oder einen verteilten Cache zu verwenden? Zum Beispiel Redis ein Schlüssel Wert speichern (ich habe es noch nie zuvor verwendet).
Danke für Ihre Hilfe