¿Qué es el cálculo de tiempo real?
Consulte la imagen a continuación:
Tome las estadísticas de los productos calientes como ejemplo para ver los métodos de cálculo tradicionales:
1 Guarde el comportamiento del usuario, el registro y otra información en la base de datos.
2 Guarde la información del pedido en la base de datos.
3 Use el disparador o la coroutina para establecer índices locales o índices independientes remotos.
4 Juego de información del pedido, detalles del pedido, información del usuario, información del producto, etc., agregue el producto en 20 minutos y regrese al top 10.
5Web o pantalla de aplicación.
Esta es una escena imaginaria, pero suponiendo que tenga experiencia en el tratamiento de escenas similares, debe experimentar tales problemas y dificultades:
1. Problema de expansión horizontal (escala)
Obviamente, si se trata de un sitio web de comercio electrónico con una determinada escala, la cantidad de datos es muy grande. Debido a que la información de transacción implica transacciones, es difícil abandonar directamente la capacidad de transacción de la base de datos de relaciones y migrar a la base de datos NoSQL con mejores capacidades de escala.
Bueno, generalmente se hace. Afortunadamente, podemos archivar antes de la fecha y almacenar en caché los resultados mediante el procesamiento por lotes de computación fuera de línea.
Sin embargo, los requisitos aquí están dentro de los 20 minutos, lo cual es difícil.
2. Problemas de rendimiento <Br /> Este problema es consistente con la escala.
La pregunta es, ¿cuántas veces necesitamos ingresar al almacén?
¿Qué pasa con 10 minutos?
¿Qué pasa con 5 minutos?
¿Qué pasa con el tiempo real?
Además, la capa comercial también enfrenta las limitaciones de la potencia informática de un solo punto y requiere expansión horizontal, por lo que es necesario considerar el problema de la consistencia.
Por lo tanto, todo es muy complicado aquí.
3. Problemas de expansión empresarial <Br /> Suponiendo que no solo debemos manejar las estadísticas de los productos de venta en caliente, sino también la publicidad estadística, o determinar rápidamente las características del usuario en función del comportamiento de acceso del usuario para ajustar la información que ve, Wait, la empresa. La capa será más complicada.
Tal vez tengas una mejor manera, pero de hecho, lo que necesitamos es una nueva cognición:
Lo que sucedió en este mundo fue real.
Por lo tanto, necesitamos un modelo que se calcule en tiempo real, no un modelo de procesamiento por lotes.
Este modelo que necesitamos debe ser capaz de procesar muchos datos, por lo que es mejor tener una buena capacidad de escala.
Luego, este modelo de computación es un modelo de cálculo de tiempo real, que también puede considerarse como un modelo de computación de transmisión.
Ahora suponiendo que tenemos un modelo así, podemos diseñar felizmente nuevos escenarios comerciales:
¿Cuál es el Weibo más reenviado?
¿Cuáles son los productos más populares?
¿Cuáles son los puntos calientes que todos buscan?
¿Qué anuncio, en qué posición, se hace más clic en?
O podemos preguntar:
¿Qué pasó en este mundo?
¿Cuál es el tema más popular de Weibo?
Utilizamos un recuento de ventanas deslizantes simples para presentar el misterioso velo del cálculo de tiempo real llamado.
Suponga que nuestros requisitos comerciales son:
Estadísticas 10 temas más calientes de Weibo en 20 minutos.
Para resolver este problema, debemos considerar:
1. Fuente de datos <Br /> Aquí, suponiendo nuestros datos, el tema del Push de Weibo Long Connection.
2. Modelado de problemas
El tema que creemos es la expansión del número#.
Por ejemplo: @ForEach_Break: Hola,#比#, te amo,#Weibo#.
"Mundo" y "Weibo" son temas.
3. Motor calculador
Usamos Storm.
4. Defina el tiempo
¿Cómo definir el tiempo?
La definición de tiempo es algo difícil, dependiendo de cuál sea la precisión que se requiere.
Según la realidad, generalmente usamos Tick para representar este concepto.
En la infraestructura de Storm, la fase de inicio del albacea usa el temporizador para activar el evento "después de un período de tiempo".
Como se muestra a continuación:
(DEFN SETUP-TICKS! [Ejecutor de trabajadores] ive-coleue (: recibe-data de ejecutor) context (: trabajador-contexto ejecutor-data)] (cuando tick-tim-secs (o (system-id? ( : Componente-id-ejecutor-data))))) Alse (topología de tormenta de tormenta-enable-timessage-timeOuts) (=: spout (: type ejecutor-data)) (log-Message "Tiempos de espera para el ejecutor" (: componente- Id ejecutor-data) ":" ("(" (: Ejecutor-ID Ejecutor-Data) (Programa-Recuperación (: trabajador de usuario-Tímero) Tick-Secs Tick-Tim-Tim-Tim-Secs (FN [] (Disruptor/ Publicar receptor-cola [[nil (tupleImpl. Context [tick -time-secs] constants/system_task_id constants/system_tick_stream_id)]))))))))))))),),),)Cada vez, dicho evento se activará.
¿Cómo Bolt juzga que la tupla recibida representa "tick"?
Responsable de administrar el hilo del ejecutor de Bolt.
Public static boolean isstick (tuple tuple) {return tuple! ¡Combinado con el código CLOJURE de TECHO DE SETUPE.
Se puede ver que en el siguiente código, System_Task_ID también pasó a Tuple:
;
(TupleImpl. Context [Tick-Time-Secs] Constants/System_Task_ID Constants/System_Tick_Stream_id))))
Luego use el siguiente código para obtener el sistema_component_id:
Public String getComponentId (int taskID) {if (taskID == constants.system_id_id) {return constants.system_component_id;Con la infraestructura anterior <Br />, también necesitamos algunos medios para completar la "ingeniería" y convertir la idea en realidad.
Aquí, veamos el diseño de la ventana deslizante de Michael G. Noll.
Topología
String spoutid = "WordGenrator"; / La ventana de tiempo de RollingCountbolt es de 9 segundos, y los resultados estadísticos se envían cada 3 segundos al builter aguas abajo. ; // IntermediatAnkingSbolt, se completará parte de la agregación, contando el top-n topile builder.setbolt (intermediatorankerid, new IntermediaaticRankingsBolt (Top_N), 4). Complete la agregación completa y cuente el tope de temas Top-N.
El diseño superior anterior es el siguiente:
Combinando el cálculo de la agregación con el tiempo
Anteriormente, describimos el incidente de Tick, que activará el método de ejecución del Bolt durante la devolución de llamada, que se puede hacer:
RollingCountbolt:
@Override public void ejecutar (tuple tuple) {if (tpleutils.istick (tuple)) {log.debug ("recibió tick tuple, triggey emit de las ventanas actuales"); Envíelo y deje que la ventana desplácese emitCurrentWindowCounts ();} else {// Tuple convencional, y el recuento de temas puede contable (tuple);} // obj es el tema, agregue un conteo ++ // prestar atención, la velocidad aquí ¿Básicamente es básicamente básico aquí. Bolt puede ser escalado. EmitCurrentWindowCounts () {MAP <Object, Long> Counts = CountCountStHenAdVanceWindow (); _lengtt h_warning_template , Realwindowldengthinseconds, WindowLengthInseconds);} emit (cuenta, realwindowldenghinseconds);}El código de arriba puede ser un poco abstracto.
IntermediankingsBolt y totalRankingsBolt:
Public Final Void Execute (Tuple Tuple, BasicOutputCollector Collector) {if (Tupleutils.istick (Tuple)) {getLogger (). ;} Else {// Polytes y clasificar updaterankingswithtuple (tuple);}}Entre ellos, el método de clasificación agregado de Internet y TotalRankingsBolt es ligeramente diferente:
Método de clasificación agregada de soplo en intermediación:
// IntermediatorAnkings Bolt El método de clasificación agregada: @Override Void UpdateAnkingswithTuple (Tuple Tuple) {// Este paso es extraer el número de temas y temas. Times está agregado, y luego todos los temas shaper.getRankings ().El método de clasificación agregada de TotalRankingsBolt:
// Método de clasificación agregada de TotalRankingsBolt @Override Void Updaterankingswithtuple (Tuple) {// Proponga el resultado intermedio del resultado intermedio de los intermedios de Internet. ().El método de clasificación pesada es relativamente simple y grosero, porque solo N, N no será muy grande:
Private void () {colección.sort (rankedItems); Conclusión
La siguiente figura puede ser el resultado que queremos.
Lo anterior es todo el contenido de este artículo.