Was ist Real -Time -Berechnung?
Bitte beachten Sie das Bild unten:
Nehmen Sie die Statistiken der heißen Produkte als Beispiel, um die herkömmlichen Berechnungsmethoden anzuzeigen:
1 Speichern Sie das Benutzerverhalten, das Protokoll und andere Informationen in der Datenbank.
2 Speichern Sie die Bestellinformationen in der Datenbank.
3 Verwenden Sie Trigger oder Coroutine, um lokale Indizes oder entfernte unabhängige Indexe festzulegen.
4Join-Bestellinformationen, Bestelldetails, Benutzerinformationen, Produktinformationen usw., aggregieren Sie das Produkt innerhalb von 20 Minuten und kehren Sie zu Top-10 zurück.
5Web oder App -Anzeige.
Dies ist eine imaginäre Szene, aber unter der Annahme, dass Sie Erfahrung im Umgang mit ähnlichen Szenen haben, sollten Sie solche Probleme und Schwierigkeiten erleben:
1. Horizontaler Expansionsproblem (Scale-Out)
Wenn es sich um eine E -Commerce -Website mit einer bestimmten Skala handelt, ist die Datenmenge natürlich sehr groß. Da die Transaktionsinformationen Transaktionen beinhalten, ist es schwierig, die Transaktionsfähigkeit der Beziehungsdatenbank direkt aufzugeben und mit besseren Skalierungsfunktionen in die NoSQL-Datenbank zu migrieren.
Nun, es ist im Allgemeinen fertig. Glücklicherweise können wir die Ergebnisse durch Stapelverarbeitung offline -Computing nach Datum archivieren und zwischenspeichern.
Die Anforderungen hier sind jedoch innerhalb von 20 Minuten, was schwierig ist.
2. Leistungsprobleme <BR /> Dieses Problem stimmt mit der Skalierung überein.
Die Frage ist, wie oft müssen wir das Lagerhaus betreten?
Was ist mit 10 Minuten?
Was ist mit 5 Minuten?
Was ist mit Echtzeit?
Darüber hinaus steht die Geschäftsschicht vor den Einschränkungen der Einzelpoint -Computerleistung und erfordert eine horizontale Expansion, sodass das Problem der Konsistenz berücksichtigt werden muss.
Daher ist hier alles sehr kompliziert.
3.. Wire -Expansionsprobleme <BR /> Angenommen, wir dürfen nicht nur die Statistiken heißer Verkaufswaren, sondern auch statistische Werbung Klick behandeln oder die Merkmale des Benutzers basierend auf dem Zugriffsverhalten des Benutzers schnell bestimmen, um die Informationen anzupassen, die sie warten, das Geschäft warten, das Geschäft Die Schicht wird komplizierter sein.
Vielleicht haben Sie einen besseren Weg, aber tatsächlich brauchen wir eine neue Erkenntnis:
Was auf dieser Welt passiert ist, war echte Zeit.
Wir brauchen also ein Modell, das in Echtzeit berechnet wird, kein Batch -Verarbeitungsmodell.
Dieses Modell, das wir brauchen, muss in der Lage sein, viele Daten zu verarbeiten, daher ist es am besten, eine gute Skala-Fähigkeit zu haben.
Dann ist dieses Computermodell ein reales Time -Berechnungsmodell, das auch als Streaming -Computing -Modell angesehen werden kann.
Angenommen, wir haben ein solches Modell, können wir neue Geschäftsszenarien gerne entwerfen:
Was ist die am meisten weitergeleitete Weibo?
Was sind die heißesten Produkte?
Was sind die Hot Spots, nach denen jeder sucht?
Welche Werbung, welche Position ist am meisten geklickt?
Oder wir können fragen:
Was ist in dieser Welt passiert?
Was ist das heißeste Weibo -Thema?
Wir verwenden eine einfache Zählung für Schiebfenster, um den mysteriösen Schleier der sogenannten Real -Time -Berechnung zu enthüllen.
Angenommen, unsere Geschäftsanforderungen sind:
Statistik 10 heißeste Weibo -Themen in 20 Minuten.
Um dieses Problem zu lösen, müssen wir berücksichtigen:
1. Datenquelle <br /> hier unter der Annahme unserer Daten das Thema von Weibo Long Connection Push.
2. Problemmodellierung
Das Thema, das wir glauben, ist die Erweiterung der Nummer.
Zum Beispiel: @foreach_break: Hallo,#比#, ich liebe dich,#Weibo#.
"Welt" und "Weibo" sind Themen.
3. Berechnung des Motors
Wir benutzen Sturm.
4. Definieren Sie die Zeit
Wie definiere ich Zeit?
Die Definition von Zeit ist eine schwierige Sache, je nachdem, was die Genauigkeit erforderlich ist.
Nach der Realität verwenden wir im Allgemeinen Tick, um dieses Konzept darzustellen.
In der Infrastruktur von Storm verwendet die Startphase ausführender Ausführende den Timer, um das Ereignis "nach einer bestimmten Zeit" auszulösen.
Wie unten gezeigt:
(Defn Setup-Ticks! [Arbeiter-Executor-Data] IVE-Queue (: Empfänger-Queue-Executor-Data) Kontext (: Worker-Context-Ausführungsdata)]] (wenn Tick-Time-SECs (oder (System-ID? ((System-ID)? : Komponenten-ID-Executor-data)))) Alse (Storm-Conf Topology-Enable-Message-Timeouts) (=: Spout (: Typexpositor-Data))) (Log-Message "Timeouts für Executor deaktiviert" (: Komponent- ID-Exec-Utor-Data) ":" ("(" (: Ausführungs-ID-Executor-DATA) (Zeitplanabschluss (: Benutzer-Timer-Arbeiter) Tick-Tim-Tick-Tim-Time-SECs (FN [] (disruptor/ disruptor/ Veröffentlichung von Empfangsqueue [[nil (tupleimpl. Kontext [Tick-Time-SECS] Konstanten/System_task_id Constants/System_tick_stream_id)]))))))))))))))))),))))Jedes Mal wird ein solches Ereignis ausgelöst.
Wie beurteilen Bolt, dass das erhaltene Tupel "Tick" darstellt?
Verantwortlich für die Verwaltung von Bolt's Executor -Thread.
Public static boolean isstick (tuple tuple) {return tuple! Kombiniert mit dem Clojure-Code von Setup-Tick!
Es ist zu sehen, dass im folgenden Code System_task_id auch an Tuple übergeben wurde:
;
(Tupleimpl. Kontext [Tick-Time-SECS] Konstanten/System_task_id Constants/System_Tick_Stream_id)))
Verwenden Sie dann den folgenden Code, um das System_Component_ID zu erhalten:
Public String getComponentID (int taskId) {if (taskId == constants.system_id_id) {return Constants.System_Component_ID;Mit der obigen Infrastruktur über <br /> brauchen wir auch einige Mittel, um die "Engineering" zu vervollständigen und die Idee in die Realität umzusetzen.
Schauen wir uns hier das Sliding -Fensterdesign von Michael G. Noll an.
Topologie
String Spoutid = "WordGenrator"; / RollingCountBolts Zeitfenster beträgt 9 Sekunden, und die statistischen Ergebnisse werden alle 3 Sekunden an den nachgeschalteten Builter geschickt. ; Vervollständigen Sie die vollständige Aggregation und zählen Sie den Top-N-Themenbauer.
Das obere Design oben ist wie folgt:
Kombination der Aggregationsberechnung mit der Zeit
Früher haben wir den Tick -Vorfall beschrieben, der die Ausführungsmethode des Bolzens während des Rückrufs auslöst, der erledigt werden kann:
RollingCountbolt:
@Override public void Execute (Tuple Tuple) {if (tpleUtils.Itick (Tuple)) {log.debug ("Empfangene Tuple, Triggey -Emit der aktuellen Fenster"); Senden Sie es und lassen Ist hier im Grunde genommen grundlegend. Bolt kann das CountObjandack (Tuple) {Object OBJ = Tuple.getValue (0) sein. EmitcurrentWindowCounts () {MAP <Objekt, long> countCountSthenadVanceWindow (); _lengtt h_warning_template , TatsächlicheWindowlengthInsekunden, Fensterlänge);} emit (zählt, tatsächliche schwindowlengthIneSconds);}Der obige Code kann ein bisschen abstrakt sein.
IntermedianKingsBolt & TotalRankingsBolt:
Public final void Execute (Tuple Tuple, BasicOutputCollector -Kollektor) {if (tupleutils.Istick (Tuple)) {getLogger (). ;} Else {// Polytes und sortieren Sie UpdaterankingsWithtuple (Tuple);}}Unter ihnen ist die Aggregat -Sortiermethode des Internets und des TotalRankingsbols etwas anders:
IntermediatorankingsBolt Aggregat Sorting -Methode:
// IntermediatorankingsBolt Die Aggregat -Sortiermethode: @Override void UpdateankingsWithtuple (Tuple Tuple) {// Dieser Schritt wird die Anzahl der Themen und Themen extrahieren. Die Zeiten sind aggregiert und dann alle Themen Shaper.getRankings ().Die aggregierte Sortiermethode des TotalRankingsbols:
// TotalRankingsBolts Aggregat -Sortiermethode @Override void UpdaterankingsWithtuple (TPLE TUPLE) {// Das mittlere Ergebnis des Zwischenergebnisses des Intermediates von Internet -Tuple.getValue (0); ().Die Methode der schweren Sortierung ist relativ einfach und unhöflich, da nur N, N nicht sehr groß ist:
Private void () {collections.sort (rankedItems); Abschluss
Die folgende Abbildung kann das Ergebnis sein, das wir wollen.
Das obige ist der gesamte Inhalt dieses Artikels.