Qu'est-ce que le calcul du temps réel?
Veuillez consulter l'image ci-dessous:
Prenez les statistiques des produits chauds à titre d'exemple pour voir les méthodes de calcul traditionnelles:
1 Enregistrez le comportement de l'utilisateur, le journal et d'autres informations dans la base de données.
2 Enregistrez les informations de commande dans la base de données.
3 Utilisez le déclencheur ou la coroutine pour établir des index locaux ou des index indépendants distants.
4join Informations sur la commande, les détails de la commande, les informations de l'utilisateur, les informations sur le produit, etc., agréger le produit dans les 20 minutes et revenir au top 10.
5web ou affichage de l'application.
Il s'agit d'une scène imaginaire, mais en supposant que vous avez de l'expérience dans le traitement des scènes similaires, vous devriez rencontrer de tels problèmes et difficultés:
1. Problème d'expansion horizontale (échelle)
De toute évidence, s'il s'agit d'un site Web de commerce électronique avec une certaine échelle, la quantité de données est très importante. Étant donné que les informations de transaction impliquent des transactions, il est difficile d'abandonner directement la capacité de transaction de la base de données relationnelle et de migrer vers la base de données NoSQL avec de meilleures capacités d'échelle.
Eh bien, c'est généralement fait. Heureusement, nous pouvons archiver par la date et mettre en cache les résultats par traitement par lots hors ligne de l'informatique.
Cependant, les exigences ici sont dans les 20 minutes, ce qui est difficile.
2. Problèmes de performance <BR /> Ce problème est cohérent avec l'échelle.
La question est de savoir combien de fois avons-nous besoin pour entrer dans l'entrepôt?
Qu'en est-il de 10 minutes?
Qu'en est-il de 5 minutes?
Et en temps réel?
De plus, la couche commerciale fait également face aux limites de la puissance de calcul unique et nécessite une expansion horizontale, il est donc nécessaire de considérer le problème de la cohérence.
Par conséquent, tout est très compliqué ici.
3. La couche sera plus compliquée.
Peut-être que vous avez une meilleure façon, mais en fait, ce dont nous avons besoin est une nouvelle cognition:
Ce qui s'est passé dans ce monde était le temps réel.
Nous avons donc besoin d'un modèle calculé en temps réel, pas d'un modèle de traitement par lots.
Ce modèle dont nous avons besoin doit être en mesure de traiter beaucoup de données, il est donc préférable d'avoir une bonne capacité d'échelle.
Ensuite, ce modèle informatique est un modèle de calcul en temps réel, qui peut également être considéré comme un modèle informatique en streaming.
En supposant maintenant que nous avons un tel modèle, nous pouvons concevoir avec plaisir de nouveaux scénarios commerciaux:
Quelle est la Weibo la plus transmise?
Quels sont les produits les plus chauds?
Quels sont les points chauds que tout le monde cherche?
Quelle publicité, quelle position, est la plus cliquée?
Ou, nous pouvons demander:
Que s'est-il passé dans ce monde?
Quel est le sujet de Weibo le plus chaud?
Nous utilisons un nombre de fenêtres coulissantes simples pour dévoiler le voile mystérieux du calcul du temps réel So-appelé.
Supposons que nos exigences commerciales sont:
Statistiques 10 sujets Weibo les plus chauds en 20 minutes.
Pour résoudre ce problème, nous devons considérer:
1. Source de données <br /> Ici, en supposant nos données, le sujet de Weibo Long Connection Push.
2. Modélisation des problèmes
Le sujet que nous pensons est l'expansion du numéro #.
Par exemple: @Forach_break: Bonjour, # 比 #, je t'aime, # Weibo #.
"World" et "Weibo" sont des sujets.
3. Calcul du moteur
Nous utilisons Storm.
4. Définir le temps
Comment définir le temps?
La définition du temps est une chose difficile, selon la précision requise.
Selon la réalité, nous utilisons généralement Tick pour représenter ce concept.
Dans l'infrastructure de Storm, la phase de démarrage de l'exécuteur exécute le minuteur pour déclencher l'événement "après une période de temps".
Comme indiqué ci-dessous:
(Defn Configuration-Ticks! [Worker Executor-Data] Ive-Queue (: Recee-Qu-Queue Executor-data) context (: worker-context exécutor-data)] (lorsque Tick-Time-Secs (ou (System-id? ( : Composant-id Executor-data)))) ALSE (Storm-Conf Topology-Enable-Message-Timeouts) (=: SPOUT (: Type Executor-Data))) (Log-Message "Timeouth désactivé pour l'exécuteur" (: composant- Id exec utor-data) ":" ("(" (: exécutor-id exécutor-data) (schedule-reurring (: user-timer worker) ti time-secs bick-time-secs (fn [] (perturbateur / Publish Recee-Quyue [[NIL (TuPleIMPL. Context [Tick -Time-Secs] Constants / System_Task_Id Constants / System_Tick_Stream_id)])))))))))))))))))),),),)Chaque fois, un tel événement sera déclenché.
Comment Bolt juge-t-il que le tuple reçu représente "Tick"?
Responsable de la gestion du thread d'exécuteur de Bolt.
Public static boolean isstick (tuple tuple) {return tuple! Combiné avec le code Clojure de Configuration-Tick!
On peut voir que dans le code suivant, System_Task_id a également transmis à Tuple:
;
(TuPleImpl. Context [Tick-Time-Secs] Constants / System_Task_Id Constantes / System_Tick_Stream_ID))
Utilisez ensuite le code suivant pour obtenir le System_Component_ID:
String public getComponentId (int tasid) {if (taskId == constants.system_id_id) {return constants.system_component_id;Avec l' infrastructure ci-dessus <br />, nous avons également besoin de certains moyens pour compléter «l'ingénierie» et transformer l'idée en réalité.
Ici, regardons la conception de fenêtres coulissantes de Michael G. Noll.
Topologie
String Spoutid = "WordGenrator"; String CounterId = Counter "; String IntermediatorankerId =" intermediatorank "; / La fenêtre temporelle de RollingCountbolt est de 9 secondes, et les résultats statistiques sont envoyés toutes les 3 secondes au builter en aval. ; Terminez l'agrégation complète et comptez le Top-N Topic Builder.setbolt (TotalRankerid, New TotalRankingSbolt (TOP_N)).
La conception supérieure ci-dessus est la suivante:
Combinant le calcul de l'agrégation avec le temps
Plus tôt, nous avons décrit l'incident de tick, qui déclenchera la méthode d'exécution du Bolt pendant le rappel, ce qui peut être fait:
RollingCountbolt:
@Override public void execute (tuple tuple) {if (tPleutils.istick (tuple)) {log.debug ("reçoit le tick tuple, triggey émit des fenêtres actuelles"); Envoyez-le et laissez la fenêtre faire défiler EmitCurrentWindowCounts ();} else {// Tuple conventionnel, et le nombre de sujets peut compter (tuple);} // obj est le sujet, ajoutez un comptage ++ // prêter attention, la vitesse ici est essentiellement basique ici. Bolt peut être évolutif. EmitCurrentWindowCouts () {map <objet, long> countS = countCountThenAdvanceWindow (); _lengtt h_warning_template .Le code ci-dessus peut être un peu abstrait.
Intermediankingsbolt & TotalRankingsBolt:
Public Final Void Execute (Tuple Tuple, BasicOutputCollector Collector) {if (Tupleutils.istick (tuple)) {getlogger (). ;} Else {// polytes et trier UpdaterankingsWithTuple (tuple);}}Parmi eux, la méthode de tri globale d'Internet et de TotalRankingsBolt est légèrement différente:
IntermediatorankingsBolt Aggregate Tri Method:
// Intermediatorankingsbolt La méthode de tri agrégé: @Override void updateankingswithtuple (tuple tuple) {// Cette étape est d'extraire le nombre de sujets et de sujets. Les temps sont agrégés, puis tous les sujets shaper.getRankings ().La méthode de tri agrégée de TotalRankingSbolt:
// Méthode de tri globale de TotalRankingsBolt @Override void updaterankingswithTuple (TPLE Tuple) {// Proposer le résultat intermédiaire du résultat intermédiaire de l'intermédiaire d'Internet. ().La méthode de tri lourd est relativement simple et grossière, car seul n, n ne sera pas très grand:
Privé void () {Collection.Sort (RankEdItems); Conclusion
La figure ci-dessous est le résultat que nous voulons.
Ce qui précède est tout le contenu de cet article.