Ho uno scenario come segue (lo si può considerare come un sistema Wireshark distribuito):
Per una singola sessione di acquisizione, ci sono circa 1 ~ 10 nodi di cattura del traffico distribuiti in una rete LAN. Ogni nodo catturante acquisirà i dati dei messaggi non elaborati alla velocità di circa 1 ~ 1000 record / secondo per circa 1 ~ 10 ore. Nel frattempo, ci sono diversi nodi di visualizzazione del traffico (app WPF) nella stessa rete LAN per visualizzare tutti i record dei messaggi acquisiti.
Requisiti:
- Tutti i record di tutte le sessioni di cattura devono essere mantenuti per ulteriori analisi.
- Durante una sessione di acquisizione, i nodi di visualizzazione dovrebbero visualizzare il messaggio non elaborato e i dettagli analizzati in tempo reale (la latenza dovrebbe essere inferiore a 1 minuto dal momento in cui è stato acquisito il messaggio non elaborato).
- Nei nodi del visualizzatore, l'utente può filtrare facilmente i dati in ogni sessione (come Wireshark).
Ora, ho un'architettura iniziale come di seguito:
E posso vedere diversi inconvenienti nella mia architettura iniziale:
- Il DB probabilmente avrà problemi di prestazioni poiché la velocità di acquisizione può essere molto alta e il visualizzatore estrae costantemente dati da esso.
- Il messaggio di analisi impiegherà molto tempo CPU di un nodo di visualizzazione e ciascun nodo di visualizzazione dovrà analizzare tutti i messaggi separatamente, il che è uno spreco poiché il risultato analizzato sarà lo stesso in tutti i nodi di visualizzazione.
- Tenere tutti i messaggi di una sessione può essere un'enorme pressione di memoria (messaggio superiore a 36M, ogni messaggio impiega circa 100 ~ 1000 byte) per il nodo del visualizzatore.
Qualche suggerimento per migliorare la progettazione dell'architettura?