Sto progettando un sistema che dovrebbe analizzare un numero elevato di transazioni utente e produrre misure aggregate (come le tendenze e così via). Il sistema dovrebbe funzionare velocemente, essere robusto e scalabile. Il sistema è basato su Java (su Linux).Progettazione del sistema di elaborazione analitica in tempo reale
I dati provengono da un sistema che genera file di registro (CSV based) di transazioni utente. Il sistema genera un file ogni minuto e ogni file contiene le transazioni di diversi utenti (ordinati per ora), ogni file può contenere migliaia di utenti.
Una struttura di dati di esempio per un file CSV:
10: 30: 01, 1 utente, ...
10: 30: 01, 1 utente, ...
10:30:02 , l'utente 78, ...
10: 30: 02, l'utente 2, ...
10: 30: 03, 1 utente, ...
10: 30: 04, l'utente 2, ...
. . .
Il sistema che sto pianificando dovrebbe elaborare i file ed eseguire alcune analisi in tempo reale. Deve raccogliere l'input, inviarlo a diversi algoritmi e altri sistemi e memorizzare i risultati calcolati in un database. Il database non contiene i record di input effettivi ma solo un'analisi aggregata di alto livello sulle transazioni. Ad esempio tendenze ed ecc.
Il primo algoritmo che sto pianificando di utilizzare richiede il funzionamento ottimale di almeno 10 record utente, se non riesce a trovare 10 record dopo 5 minuti, dovrebbe utilizzare i dati sempre disponibili.
Vorrei utilizzare Storm per l'implementazione, ma preferirei lasciare la discussione a livello di progettazione il più possibile.
un elenco dei componenti del sistema:
Un compito che controlla i file in ingresso ogni minuto.
Un'attività che legge il file, lo analizza e lo rende disponibile per altri componenti di sistema e algoritmi.
Un componente per memorizzare 10 record per un utente (non più di 5 minuti), quando vengono raccolti 10 record o trascorsi 5 minuti, è il momento di inviare i dati all'algoritmo per l'ulteriore elaborazione. Poiché il requisito è quello di fornire almeno 10 record per l'algoritmo, ho pensato di utilizzare Storm Field Grouping (che significa che la stessa attività viene chiamata per lo stesso utente) e tracciare la raccolta di 10 record dell'utente all'interno dell'attività, ovviamente io piano di avere molte di queste attività, ciascuna gestisce una parte degli utenti.
Ci sono altri componenti che funzionano su una singola transazione, per loro ho intenzione di creare altre attività che ricevono ogni transazione mentre viene analizzata (in parallelo ad altre attività).
Ho bisogno del vostro aiuto con # 3.
Quali sono le migliori pratiche per la progettazione di tale componente? È ovvio che è necessario mantenere i dati per 10 record per utente. Una mappa dei valori chiave può essere d'aiuto, è meglio avere la mappa gestita nell'attività stessa o utilizzando una cache distribuita? Ad esempio Redis un key value store (non l'ho mai usato prima).
Grazie per il vostro aiuto