Estoy diseñando un sistema que debe analizar un gran número de transacciones de usuarios y producir medidas agregadas (como tendencias, etc.). El sistema debería funcionar rápido, ser robusto y escalable. El sistema está basado en Java (en Linux).Diseño del sistema de procesamiento analítico en tiempo real
Los datos provienen de un sistema que genera archivos de registro (basados en CSV) de transacciones de usuario. El sistema genera un archivo cada minuto y cada archivo contiene las transacciones de diferentes usuarios (ordenados por tiempo), cada archivo puede contener miles de usuarios.
Una estructura de datos de muestra para un archivo CSV:
10: 30: 01, el usuario 1, ...
10: 30: 01, el usuario 1, ...
10:30:02 , 78 de usuario, ...
10: 30: 02, el usuario 2, ...
10: 30: 03, el usuario 1, ...
10: 30: 04, el usuario 2, ...
. . .
El sistema que estoy planeando debe procesar los archivos y realizar algunos análisis en tiempo real. Tiene que recopilar la entrada, enviarla a varios algoritmos y otros sistemas y almacenar los resultados calculados en una base de datos. La base de datos no contiene los registros de entrada reales, sino solo el análisis agregado de alto nivel sobre las transacciones. Por ejemplo tendencias y etc.
El primer algoritmo que planeo usar requiere para un mejor funcionamiento de al menos 10 registros de usuario, si no puede encontrar 10 registros después de 5 minutos, debe usar los datos disponibles.
Me gustaría utilizar Storm para la implementación, pero preferiría dejar esta discusión en el nivel de diseño tanto como sea posible.
Una lista de los componentes del sistema:
Una tarea que supervisa los archivos entrantes cada minuto.
Una tarea que lee el archivo, lo analiza y lo pone a disposición para otros componentes y algoritmos del sistema.
Un componente para almacenar 10 registros para un usuario (no más de 5 minutos), cuando se recopilan 10 registros o pasan 5 minutos, es hora de enviar los datos al algoritmo para su posterior procesamiento. Dado que el requisito es proporcionar al menos 10 registros para el algoritmo, pensé en usar Storm Field Grouping (lo que significa que se llama a la misma tarea para el mismo usuario) y rastrear la colección de 10 registros de usuario dentro de la tarea, por supuesto planea tener varias de estas tareas, cada una maneja una porción de los usuarios.
Existen otros componentes que funcionan en una sola transacción, para ellos planeo crear otras tareas que reciban cada transacción a medida que se analizan (en paralelo a otras tareas).
Necesito tu ayuda con el n. ° 3.
¿Cuáles son las mejores prácticas para diseñar un componente de este tipo? Es obvio que necesita mantener los datos de 10 registros por usuario. Un mapa de valores clave puede ayudar. ¿Es mejor tener el mapa administrado en la tarea en sí o usar un caché distribuido? Por ejemplo, Redis es un almacén de valores clave (nunca lo había usado antes).
Gracias por su ayuda