Berichtgenerierungsentwurfsmuster in Rails?

8

Ich erstelle mehrere Berichte in einer Anwendung und bin dabei auf einige Möglichkeiten zur Erstellung der Berichte gestoßen. Ich möchte Sie auf die besten / gebräuchlichsten Wege zum Erstellen von Berichten aufmerksam machen, die sowohl skalierbar als auch in Echtzeit sind.

Zuerst einige Bedingungen / Grenzen / Ziele:

  1. Der Bericht sollte in Echtzeit verarbeitet werden können (mit node.js oder ajax polling)
  2. Der Bericht sollte auf optimierte Weise aktualisiert werden
    • Wenn es im Bericht um Seitenaufrufe geht und Sie tausende pro Sekunde erhalten, ist es möglicherweise nicht das Beste, den Bericht in jeder Seitenansicht zu aktualisieren, aber möglicherweise alle 10 oder 100.
    • Aber es sollte immer noch in Echtzeit sein (so dass tägliche / stündliche Cron keine akzeptable Alternative ist).
  3. Der Bericht sollte nicht die Dinge neu berechnen, die er bereits berechnet hat.
    • Wenn es zählt, erhöht es einen Zähler.
    • Wenn es Mittelwerte gibt, kann es vielleicht den Durchschnitt aktualisieren, ohne alle Aufzeichnungen zu erfassen, die es jede Sekunde durchschnittlich berechnet und neu berechnet (ich bin mir nicht sicher, wie ich das noch machen soll).
    • Wenn es Zählungen / Durchschnitte für einen Datumsbereich ( heute , letzte_Woche , letzte_Monat usw.) gibt und es in Echtzeit ist Es sollte nicht nötig sein, diese Mittelwerte jede Sekunde / Anfrage neu zu berechnen, sondern nur die minimalste Operation.
  4. Wenn der Bericht über einen Datensatz läuft und der "Lebenszyklus" des Datensatzes vollständig ist (sagen wir Project , und das Projekt dauerte 6 Monate, hatte eine Menge Aktivitäten, aber jetzt ist es vorbei), sollte der Bericht dauerhaft gespeichert werden so ziehen nachfolgende Retrievals einfach ein vorberechnetes Dokument.

Die Berichte müssen nicht durchsuchbar sein. Sobald die Daten in einem Dokument sind, zeigen wir nur das Dokument an. Der Client erhält grundsätzlich einen JSON-Baum, der alle Statistiken, Diagramme usw. darstellt, so dass er in Javascript gerendert werden kann.

Meine Frage stellt sich, weil ich versuche, einen Weg zu finden, in Echtzeit über riesige Datensätze zu berichten .

Sagen Sie, dass ich über die allgemeine Benutzeranmeldung und die Aktivität auf einer Website berichte. Die Website hat 1 Million Benutzer und es gibt durchschnittlich 1000 Seitenaufrufe pro Sekunde. Es gibt ein User Modell und ein PageView Modell, sagen wir, wo User has_many :page_views . Sagen wir, ich habe folgende Werte:

%Vor%

Dinge, die ich versucht habe:

1. Wobei User und PageView beide ActiveRecord-Objekte sind, also alles über SQL.

Ich schnappe alle Benutzer in Chunks so etwas:

%Vor%

2. Beide Datensätze sind MongoMapper::Document objects

Map-reduce ist vor Ort sehr langsam zu berechnen, und ich habe noch nicht die Zeit dafür aufgewendet, um herauszufinden, wie diese Arbeit in Echtzeit funktioniert (check out Kolibri ). Grundsätzlich mache ich das gleiche: Zerkleinere die Datensätze, füge das Ergebnis zu einem Hash hinzu und das ist es.

3. Jede Berechnung ist eine eigene SQL / NoSQL-Abfrage

Dies ist der Ansatz, den das Statistik-Juwel von Rails annimmt. Das Einzige, was ich nicht mag, ist die Menge an Abfragen, die dies möglicherweise machen könnte (ich habe nicht bewertet, ob 30 Abfragen pro Anfrage pro Bericht besser sind, als alle Objekte in den Speicher zu schreiben und in reinem Ruby zu sortieren)

Frage

Die Frage, die ich vermute, ist, was ist der beste Weg aus Ihrer Erfahrung, Echtzeitberichte über große Datensätze zu erstellen? Mit Chunking / Sortierung der Datensätze im Speicher jeder Anfrage (was ich gerade mache, was ich mit Stundy-Cron etwas optimieren kann, aber es ist nicht Echtzeit), brauchen die Berichte etwa eine Sekunde, um zu generieren (komplexe Datumsformeln und so), manchmal länger.

Neben den traditionellen Optimierungen (bessere Implementierung von Daten, sql / nosql Best Practices), wo finde ich einige praktische und praxiserprobte Artikel zum Erstellen von Berichten? Ich kann Berichte erstellen kein Problem, das Problem ist, wie machen Sie es schnell, in Echtzeit, optimiert und richtig ? Habe nichts wirklich gefunden.

    
Lance Pollard 18.01.2011, 19:35
quelle

0 Antworten

Tags und Links