Per una soluzione di raccolta come questa, consiglierei un approccio a più stadi. Redis è bravo nella comunicazione in tempo reale . Redis è progettato come un archivio chiave/valore in memoria ed eredita alcuni vantaggi molto interessanti dell'essere un database di memoria:O(1) operazioni di elenco. Finché c'è RAM da utilizzare su un server, Redis non rallenterà spingendo fino alla fine delle tue liste, il che è positivo quando devi inserire elementi a una velocità così estrema. Sfortunatamente, Redis non può funzionare con set di dati più grandi della quantità di RAM che hai (solo scrive su disco, la lettura serve per riavviare il server o in caso di arresto anomalo del sistema) e il ridimensionamento deve essere eseguito da tu e la tua domanda . (Un modo comune è distribuire le chiavi su numerosi server, che è implementato da alcuni driver Redis, in particolare quelli per Ruby on Rails.) Redis ha anche il supporto per semplici messaggi di pubblicazione/sottoscrizione, che a volte possono anche essere utili.
In questo scenario, Redis è la "fase uno". Per ogni specifico tipo di evento si crea una lista in Redis con un nome univoco; ad esempio abbiamo "pagina visualizzata" e "link cliccato". Per semplicità vogliamo assicurarci che i dati in ogni lista abbiano la stessa struttura; il link cliccato può avere un token utente, il nome del link e l'URL, mentre la pagina visualizzata può avere solo il token utente e l'URL. La tua prima preoccupazione è sapere il fatto che è successo e qualsiasi cosa assolutamente necessaria i dati di cui hai bisogno vengono inviati.
Successivamente abbiamo alcuni semplici addetti all'elaborazione che prelevano queste informazioni freneticamente inserite dalle mani di Redis, chiedendogli di rimuovere un elemento dalla fine dell'elenco e consegnarlo. L'operatore può apportare modifiche/deduplicazioni/ricerche ID necessarie per archiviare correttamente i dati e trasferirli a un sito di archiviazione più permanente. Attiva tutti i lavoratori di cui hai bisogno per mantenere sopportabile il carico di memoria di Redis. Puoi scrivere i lavoratori in qualsiasi cosa desideri (Node.js, C#, Java, ...) purché abbia un driver Redis (la maggior parte dei linguaggi Web lo fa ora) e uno per l'archiviazione desiderata (SQL, Mongo, ecc. )
MongoDB è bravo a archiviazione di documenti . A differenza di Redis, è in grado di gestire database più grandi della RAM e supporta da solo lo sharding/replica. Un vantaggio di MongoDB rispetto alle opzioni basate su SQL è che non è necessario disporre di uno schema predeterminato, sei libero di modificare il modo in cui i dati vengono archiviati come preferisci in qualsiasi momento.
Suggerirei, tuttavia, Redis o Mongo per la fase del "passaggio uno" di conservazione dei dati per l'elaborazione e utilizzare una configurazione SQL tradizionale (Postgres o MSSQL, forse) per archiviare i dati post-elaborati. Il monitoraggio del comportamento del cliente suona come dati relazionali per me, dal momento che potresti voler andare "Mostrami a tutti coloro che visualizzano questa pagina" o "Quante pagine ha visualizzato questa persona in questo dato giorno" o "Quale giorno ha avuto il maggior numero di spettatori in totale? ". Potrebbero esserci join o query ancora più complessi per scopi analitici che ti vengono in mente e le soluzioni SQL mature possono fare molto di questo filtro per te; NoSQL (in particolare Mongo o Redis) non può eseguire join o query complesse su diversi set di dati.